编写DES加密工具类
package com.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; public class DESUtil{ private static 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()); //生成密钥对象 generator.init(secureRandom); key = generator.generateKey(); generator = null; } catch (Exception e) { throw new RuntimeException(e); } } /** * 获取解密之后的信息 * @param str * @return */ public static String getEncryptString(String str) { //基于BASE64编码,接收byte[]并转换成String BASE64Encoder base64encoder = new BASE64Encoder(); try { //按utf8编码 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) { // TODO: handle exception throw new RuntimeException(e); } } /** * 获取解密之后的信息 * @param str * @return */ 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) { // TODO: handle exception throw new RuntimeException(e); } } public static void main(String[] args) { //要加密的用户和密码,运行并复制粘贴到替换jdbc.properties配置文件对应的用户密码 System.out.println(getEncryptString("root")); System.out.println(getEncryptString("root")); } }
编写程序启动时解密类
package com.o2o.util; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; 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 = DESUtil.getDecryptString(propertyValue); return decryptValue; } else { return propertyValue; } } //判断传过来的数据是否加密过 private boolean isEncryptProp(String propertyName) { for (String encryptpropertyName : encryptPropNames) { if (encryptpropertyName.equals(propertyName)) return true; } return false; } }
替换xml配置文件中的<context:property-placeholder location="classpath:jdbc.properties"/>为
<bean class="com.o2o.util.EncryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<!-- <value>classpath:redis.properties</value> -->
</list>
</property>
<property name="fileEncoding" value="UTF-8" />
</bean>