`

spring读取加密属性

阅读更多
在开发和设计过程中,通常需要对一些配置数据进行加密,如数据库的连接方式等,在读取到加密数据后,我们必须解密后才能使用。

以下是来自书籍《Spring 3.x 企业应用开发实战》示例,可做参考!
一、编写加密代码DESUtil.java
/**
 * DESUtil.java
 * cn.com.songjy
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-9-25    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy;

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * ClassName:DESUtil
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-9-25 下午4:19:48
 */

public class DESUtil {

	private static Log log = LogFactory.getLog(DESUtil.class);

	public static void main(String[] args) {

		if (null != args)
			if (1 <= args.length)
				for (String src : args)
					log.info(src + ":" + encrypt(src));

	}

	/* 1、指定DES加密解密所用的密钥 */
	private static Key key;
	private static String KEY_STR = "myKey";

	static {
		try {
			KeyGenerator generator = KeyGenerator.getInstance("DES");
			generator.init(new SecureRandom(KEY_STR.getBytes()));
			key = generator.generateKey();
			generator = null;
		} catch (NoSuchAlgorithmException e) {
			log.error(e.getMessage(), e);
		}
	}

	/* 2、对字符串进行DES加密,返回BASE64编码的加密字符串 */
	public static String encrypt(String src/* 明文 */) {
		BASE64Encoder base64en = new BASE64Encoder();
		try {
			byte[] src_byte = src.getBytes("UTF-8");
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key);
			byte[] final_byte = cipher.doFinal(src_byte);
			return base64en.encode(final_byte);
		} /*
		 * catch (UnsupportedEncodingException e) { log.info(e.getMessage(), e);
		 * } catch (NoSuchAlgorithmException e) { log.info(e.getMessage(), e); }
		 * catch (NoSuchPaddingException e) { log.info(e.getMessage(), e); }
		 */catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/* 3、对BASE64编码的加密字符串进行解密,返回解密后的字符串 */
	public static String decrypt(String src/* 密文 */) {
		BASE64Decoder base64de = new BASE64Decoder();
		try {
			byte[] src_byte = base64de.decodeBuffer(src);
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, key);
			byte[] decrypt_byte = cipher.doFinal(src_byte);
			return new String(decrypt_byte, "UTF-8");
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
}


二、继承PropertyPlaceholderConfigurer类并实现接口convertProperty
/**
 * EncryptPropertyPlaceholderConfigurer.java
 * cn.com.songjy
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-9-25    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

/**
 * ClassName:EncryptPropertyPlaceholderConfigurer
 *
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-9-25	下午4:22:13
 */

public class EncryptPropertyPlaceholderConfigurer extends
		PropertyPlaceholderConfigurer {

	private Log log = LogFactory.getLog(EncryptPropertyPlaceholderConfigurer.class);
	
	/**
	 * (non-Javadoc)
	 * @see org.springframework.beans.factory.config.PropertyResourceConfigurer#convertProperty(java.lang.String, java.lang.String)
	 */
	@Override
	protected String convertProperty(String propertyName, String propertyValue) {
		
		if(encryptPropNames.contains(propertyName))//属性propertyName的值加密了,需要解密
			return DESUtil.decrypt(propertyValue);
		
		return super.convertProperty(propertyName, propertyValue);
		
	}
	
	private List<String> encryptPropNames;//保存加密的属性字段

	public List<String> getEncryptPropNames() {
		return encryptPropNames;
	}

	public void setEncryptPropNames(List<String> encryptPropNames) {
		for (String string : encryptPropNames) {
			log.info("属性"+string+"的值已加密");
		}
		this.encryptPropNames = encryptPropNames;
	}
}


三、编写属性文件保存类,测试时用
/**
 * MyConfig.java
 * cn.com.songjy
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-9-26    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy;

/**
 * ClassName:MyConfig
 *
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-9-26	上午9:31:56
 */

public class MyConfig {

	private String username;
	private String password;
	
	private String username1;
	private String password1;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername1() {
		return username1;
	}
	public void setUsername1(String username1) {
		this.username1 = username1;
	}
	public String getPassword1() {
		return password1;
	}
	public void setPassword1(String password1) {
		this.password1 = password1;
	}
	
}


四、创建属性文件
song.properties
song1.properties
其中
song.properties保存的是密文,如下:
username=Pa3HE99AWOg=
password=QAHlVoUc49w=

song.properties保存的是明文,如下:
username1=songjy
password1=123456

五、编写Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean class="cn.com.songjy.EncryptPropertyPlaceholderConfigurer">
		<property name="encryptPropNames">
			<list>
				<value>username</value>
				<value>password</value>
			</list>
		</property>
		<property name="locations">
			<list>
				<value>classpath:cn/com/songjy/song.properties</value>
				<value>classpath:cn/com/songjy/song1.properties</value>
			</list>
		</property>
	</bean>

	<bean id="my" class="cn.com.songjy.MyConfig">
		<property name="username" value="${username}"/>
		<property name="password" value="${password}"/>
		<property name="username1" value="${username1}"/>
		<property name="password1" value="${password1}"/>
	</bean>
	
</beans>

六、测试类编写
/**
 * Test.java
 * cn.com.songjy
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-9-26    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * ClassName:Test
 *
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-9-26	上午9:35:31
 */

public class Test {

	/**
	 * @method main
	 * @param args
	 * @since v1.0
	 */

	public static void main(String[] args) {

		ApplicationContext ac = new ClassPathXmlApplicationContext("cn/com/songjy/beans.xml");
		
		//MyConfig my = (MyConfig) ac.getBean("my");
		MyConfig my = ac.getBean(MyConfig.class);
		
		System.out.println(my.getUsername().equals(my.getUsername1()));
		System.out.println(my.getPassword().equals(my.getPassword1()));

	}

}




public void encrypt_MD5() {
		String 明文密码 = "123456";
		try {
			java.security.MessageDigest md = java.security.MessageDigest
					.getInstance("MD5");
			md.update(明文密码.getBytes());
			byte b[] = md.digest();
			int i;
			StringBuffer buf = new StringBuffer();
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			System.out.println("密文: " + buf.toString());// 32位的加密
			System.out.println("密文: " + buf.toString().substring(8, 24));// 16位的加密
		} catch (java.security.NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

MD5加密效果如下:



DES对称加密的实现及其源代码

用 Java 解密 C# 加密的数据(DES)

Java文件加密-spring属性文件加密

Spring获取Bean的几种方式
MD5,salt,SHA,PBKDF2加密

备注:本次示例使用的Spring版本是:spring-core-3.2.4.RELEASE
  • 大小: 17.6 KB
分享到:
评论

相关推荐

    在Spring中使用加密外部属性文件

    这个子类需要添加解密逻辑,以便在Spring容器初始化时读取加密属性文件,解密后再进行属性替换。 2. 在自定义的`EncryptedPropertyPlaceholderConfigurer`中,你可以添加一个方法来处理加密的属性值。例如,可以...

    spring配置文件加密实现

    在解密阶段,我们需要先读取加密后的文件,解密后的内容再写回原配置文件的位置。 TE网络,全称为Transparent Encryption(透明加密),是一种能够在文件系统级别实现数据自动加密的技术。在Java中,我们可以利用...

    spring读取properties

    ### Spring读取Properties文件的核心知识点 #### 1. **引入PropertyPlaceholderConfigurer** 在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并...

    spring中properties加密

    在Spring框架中,为了保护应用程序中的敏感信息,如数据库连接字符串、API密钥或任何其他配置属性,我们经常需要对这些属性进行加密。这确保了即使代码被泄露,这些关键信息也不会轻易落入他人之手。本文将深入探讨...

    json接口的spring实例(含httpclient、加密解密)

    本示例将围绕一个基于Spring框架实现的JSON接口,结合HTTPClient库进行网络通信,并利用DES(Data Encryption Standard)加密解密技术确保数据安全。 首先,我们来看JSON接口的实现。Spring框架提供了丰富的支持来...

    spring中的数据源配置信息加密方案

    在Spring启动时,通过配置Jasypt的解密器,使得Spring能够自动解密并加载这些加密的属性。 2. **环境变量或系统属性**:将敏感信息存储在环境变量或系统属性中,而不是直接写在配置文件里。这样,即使有人获取到...

    spring,配置文件从属性文件读取JDBC连接的相关参数

    以下是如何在Spring中从这个文件中读取这些参数的步骤: 1. **创建属性文件**: 首先,我们需要创建一个名为`jdbc.properties`的文件,通常放在项目的`src/main/resources`目录下,以便在运行时被自动加载。该文件...

    spring session 中源码更改

    在session共享中遇到的坑。自己通过更改源码实现自定义功能

    Spring Cloud 配置中心内容加密的配置方法

    在Spring Cloud配置中心的配置文件中(通常是`bootstrap.properties`或`bootstrap.yml`),添加一个名为`encrypt.key`的属性,值是你选择的加密密钥。例如: ```yaml encrypt: key: 0e010e17-2529-4581-b907-c8...

    spring配置文件加密方法示例

    当Spring容器启动时,它会读取这些配置文件并根据其中的指示来创建和管理Bean。 为了加密配置文件中的敏感信息,我们可以自定义一个配置处理器类,继承自Spring的`PropertyPlaceholderConfigurer`。这个类负责处理...

    druid实现springmvc数据库连接的用户名和密码加密

    在Spring MVC中,可以创建一个自定义的Bean,该Bean使用Java的`java.security.MessageDigest`类或其他加密库来实现加密功能。 2. **扩展Druid配置**:默认的Druid配置并不直接支持加密的用户名和密码。因此,我们...

    Spring@PropertySource 配置文件自定义加密、自定义Yaml文件加载

    在Spring框架中,`@PropertySource`注解用于指定配置文件的位置,以便Spring可以在启动时自动加载这些属性值。在实际开发中,我们有时需要对这些配置文件进行加密,以增强系统的安全性。此外,除了传统的.properties...

    spring cloud config、bus源码

    在读取配置文件时,Spring Cloud Config/Bus 会自动解密这些信息。 curl 命令可以用于加密和解密操作。例如,使用以下命令可以将一个字符串进行加密: curl http://localhost:8080/encrypt -d mysecret 结果将是...

    ClassFinal是一款java class文件安全加密工具

    这款工具能够对编译后的`.class`文件进行加密处理,使得未经授权的用户无法轻易读取或反编译代码,从而提高代码的安全性。 ClassFinal的特点在于其便捷性和兼容性。它支持直接加密`.jar`或`.war`包,这意味着开发者...

    Spring Cloud Config RSA简介及使用RSA加密配置文件的方法

    引入RSA加密,我们可以将配置文件中的敏感信息加密,只在Config Server中保留私钥进行解密,这样即使配置文件被非法获取,也无法直接读取到明文信息。以下是使用RSA加密配置文件的步骤: 1. **生成密钥对**: 使用...

    spring cloud 中文文档

    - **加密和解密**:提供了关于如何使用Spring Cloud Config加密和解密配置属性的指南。 - **密钥管理**:解释了如何管理加密密钥,包括密钥的存储和轮换策略。 #### Spring Cloud Bus - **推送通知和Spring Cloud ...

    Spring Security 教程(Spring Security Tutorial)1

    - Spring Security 可以通过 JDBC 从数据库中读取用户信息和权限,这使得认证信息的存储和管理变得灵活。 8. **使用 JPA 及 UserDetailsService**: - 如果应用使用 JPA(Java Persistence API)作为数据访问技术...

    web应用数据库密码加密

    除了应用层的密码加密,还可以在数据库层面进行数据加密,如使用数据库的透明数据加密(TDE)功能,确保即使数据被盗取,也无法直接读取。 7. **监控和日志** 实施安全审计和监控,对异常登录行为进行报警,及时...

    Spring Cloud Finchley.SR1-Spring Cloud 手册-Spring Cloud 文档

    - **Serving Encrypted Properties**:提供加密属性服务。 - **Serving Alternative Formats**:提供替代格式服务。 - **Serving Plain Text**:提供纯文本服务。 - **Embedding the Config Server**:嵌入式...

    第十二章_开发Struts_2+Spring应用(加密破解版).pdf

    在本章中,我们将深入探讨如何开发基于Struts 2和Spring的应用程序。Struts 2作为一款强大的MVC框架,结合Spring的依赖注入和事务管理能力,为开发者提供了高效且灵活的企业级应用开发解决方案。 12.1 介绍 在Java ...

Global site tag (gtag.js) - Google Analytics