編寫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>