概述
为了安全,我们需要对数据库的用户名和密码进行加密。
之前的文章 Spring-使用加密的属性文件02
工程结构
DES工具类
package com.artisan.o2o.util; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * * * @ClassName: DESUtils * * @Description: DES是一种对称加密算法。 所谓对称加密算法就是指使用相同的密钥 * * @author: Mr.Yang * * @date: 2018年8月9日 下午9:09:22 */ @SuppressWarnings("restriction") public class DESUtils { private static Key key; // 设置密钥key private static String KEY_STR = "myKey"; private static String CHARSETNAME = "UTF-8"; private static String ALGORITHM = "DES"; static { try { // 生成DES算法对象 KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM); // 运行SHA1安全策略 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); // 设置上密钥种子 secureRandom.setSeed(KEY_STR.getBytes()); // 初始化基于SHA1的算法对象 generator.init(secureRandom); // 生成密钥对象 key = generator.generateKey(); generator = null; } catch (Exception e) { throw new RuntimeException(e); } } /** * * * @Title: getEncryptString * * @Description: 获取加密后的信息 * * @param str * * @return: String */ public static String getEncryptString(String str) { // 基于BASE64编码,接收byte[]并转换为String BASE64Encoder base64encoder = new BASE64Encoder(); try { // 按UTF-8编码 byte[] bytes = str.getBytes(CHARSETNAME); // 获取加密对象 Cipher cipher = Cipher.getInstance(ALGORITHM); // 初始化密码信息 cipher.init(Cipher.ENCRYPT_MODE, key); // 加密 byte[] doFinal = cipher.doFinal(bytes); // byte[] to encode好的String并返回 return base64encoder.encode(doFinal); } catch (Exception e) { throw new RuntimeException(e); } } /** * * * @Title: getDecryptString * * @Description: 获取解密之后的信息 * * @param str * * @return: String */ public static String getDecryptString(String str) { // 基于BASE64编码,接收byte[]并转换为String BASE64Decoder base64decoder = new BASE64Decoder(); try { // 将字符串decode成byte[] byte[] bytes = base64decoder.decodeBuffer(str); // 获取解密对象 Cipher cipher = Cipher.getInstance(ALGORITHM); // 初始化解密信息 cipher.init(Cipher.DECRYPT_MODE, key); // 解密 byte[] doFinal = cipher.doFinal(bytes); // 返回解密之后的信息 return new String(doFinal, CHARSETNAME); } catch (Exception e) { throw new RuntimeException(e); } } // 测试 public static void main(String[] args) { System.out.println(getEncryptString("root")); System.out.println(getEncryptString("root")); System.out.println(getDecryptString("WnplV/ietfQ=")); System.out.println(getDecryptString("WnplV/ietfQ=")); } }
修改配置文件中的用户名和密码
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT #jdbc.username=root #jdbc.password=root jdbc.username=WnplV/ietfQ= jdbc.password=WnplV/ietfQ=
继承PropertyPlaceholderConfigurer,重写convertProperty方法
package com.artisan.o2o.util; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; /** * * * @ClassName: EncryptPropertyPlaceholderConfigurer * * @Description: 继承PropertyPlaceholderConfigurer,重写convertProperty * * @author: Mr.Yang * * @date: 2018年8月9日 下午9:20:04 */ public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { // 需要加密的字段数组 private String[] encryptPropNames = { "jdbc.username", "jdbc.password" }; /** * 对关键的属性进行转换 */ @Override protected String convertProperty(String propertyName, String propertyValue) { if (isEncryptProp(propertyName)) { // 解密 String decryptValue = DESUtils.getDecryptString(propertyValue); return decryptValue; } else { return propertyValue; } } /** * * * @Title: isEncryptProp * * @Description: 判断该属性是否加密 * * @param propertyName * * @return: boolean */ private boolean isEncryptProp(String propertyName) { for (String encryptpropertyName : encryptPropNames) { if (encryptpropertyName.equals(propertyName)) return true; } return false; } }
配置自定义的EncryptPropertyPlaceholderConfigurer
<bean class="com.artisan.o2o.util.EncryptPropertyPlaceholderConfigurer" p:location="classpath:jdbc.properties" p:fileEncoding="utf-8"/>
测试
启动测试,可以debug调测 ,能正常从数据库加载数据即可