`

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 session 中源码更改

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

    SpringSecurity 3.0.1.RELEASE.CHM

    18.3.3. 读取授权 18.4. 实现类 18.4.1. LdapAuthenticator实现 18.4.1.1. 常用功能 18.4.1.2. BindAuthenticator 18.4.1.3. PasswordComparisonAuthenticator 18.4.1.4. 活动目录认证 18.4.2. 链接到LDAP...

    Spring.3.x企业应用开发实战(完整版).part2

    5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构...

    Java基于mybatis的数据库加密项目源码+项目使用说明.zip

    同时,从数据库查询结果当中读取数据时自动把数据解密。 三、关于样例的说明 样例目录:examples/spring-boot-example/ 样例使用的数据库:mariadb(mysql同样适用) 数据库脚本:examples/spring-boot-example/src...

    Spring Security-3.0.1中文官方文档(翻译版)

    读取授权 19.4. 实现类 19.4.1. LdapAuthenticator 实现 19.4.1.1. 常用功能 19.4.1.2. BindAuthenticator 19.4.1.3. PasswordComparisonAuthenticator 19.4.1.4. 活动目录认证 19.4.2. 链接到LDAP ...

    Spring3.x企业应用开发实战(完整版) part1

    5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构...

    Spring Security 中文教程.pdf

    读取授权 19.4. 实现类 19.4.1. LdapAuthenticator实现 19.4.1.1. 常用功能 19.4.1.2. BindAuthenticator 19.4.1.3. PasswordComparisonAuthenticator 19.4.1.4. 活动目录认证 19.4.2. 链接到LDAP...

    基于springboot的Netty的SSL加密PKI认证通信

    采用springboot的基于Netty的SSL加密PKI认证通信,里面模拟了Netty的客户端和服务端的证书认证规则,同时分为单向认证和双向认证,信任证书链并对RA颁发的证书来进行验签,实现了双向和单向加密通信,保障了数据的...

    AngularAndSpring:这是一个示例应用程序,展示了如何使用Spring Boot,Angular 10与Ivy和Mongodb以及Spring的响应功能和Kubernetes设置

    该应用程序运行计划任务,读取加密货币的汇率并将其存储在Mongodb中。 UI使用rest服务读取费率并将其显示在表格上。 该表会定期更新。 详细信息页面显示货币数据以及当日,7天,30天,90天的汇率图表。 如果用户...

    data-encrypt:数据库读写自动加解密

    数据加密 一,简介数据库编码器自动加解密,通过注解方式实现二,支持情况支持mybatis,基于mybatis拦截器拦截器实现支持TK.mybatis扩展支持mybatis示例扩展支持spring-data-jpa三,快速开始见示例:example如果不是...

    mmcblkNX:能够读取Nintendo Switch boot0,boot1和rawnand的硬件eMMC读取器

    它已加密,但仍可作为原始分区读取和写入。 当eMMC发生故障时,它通常会变为只读状态甚至更糟-损坏。 我已经用这种方法找回了几只破碎的任天堂,这可能也对您有帮助!怎么运行的几乎所有SD卡读卡器都可以读取eMMC...

    spring-cloud-cloudfoundry-multidatasources-demo

    一个简单的应用程序,演示了如何使用Spring Cloud Cloud Foundry组件读取VCAP_SERVICES并初始化多个数据源。 此应用程序的另一个目的是演示可选的凭据加密,这是PCF客户的典型安全要求。 测验 此应用程序已配置有带...

    Spring boot配置文件加解密详解

    主要给大家介绍了关于Spring boot配置文件加解密的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Java整理的基础工具类项目

    DES加密工具类 参数验证注解 Xss攻击 接口访问超时拦截器 二叉树模糊匹配数字 Socket连接池封装 guava本地缓存异步更新 Redis实现Ip、手机号等访问次数限时,支持按照时间段(天、时、分、秒),支持按时间内(每一...

    dahua sdk转springboot项目 (刷卡、刷人脸、刷二维码、刷身份证)

    整合实现功能 (controller入口): 1. 用户管理 2. 卡管理 3. 设备控制 4. 语音对讲 5. 上传文件 6. 二维码开门 已整合接口deomo (AccessNew类): 订阅门禁事件 取消订阅门禁事件 订阅报警事件 ...二维码加密

    LSB信息隐藏源程序

    基于LSB信息隐藏源程序,可有效隐藏文本信息!

    Spring Boot 在启动时进行配置文件加解密

    主要介绍了Spring Boot 在启动时进行配置文件加解密的方法,本文通过实例给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics