程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数
一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码
properties文件全是unicode编码明文存储,程序打包交付后,其他人能够很容易使用解压软件打开jar查看你的.properties文件
所以一些敏感变量需要加密处理
首先需要了解一些基本的加密算法,比如MD5,比如DES和RSA
MD5是一种不可逆的加密算法,使用散列后特征码的方式表现需要加密的字符或者文件,常用在系统登陆的密码比对中
将MD5码存储在数据库中,用户登陆时将用户输入的字符散列成MD5后于数据库中的密文进行比对
不可逆的加密算法有一种好处就是,即使后台数据库被攻破了,对方拿这些MD5散列密文也毫无办法求得明文
DES和RSA都是可逆的加密算法,也就是可以通过密钥和密文解开得到明文,其中最常见的64位轮转DES算法
在JAVA的JDK中提供了先天性的良好的加密支持,其中就包括大名鼎鼎的DES
下面一个DESHelper类展示了如何将密文解开得到明文的方法
package com.newflypig.des; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import sun.misc.BASE64Decoder; /** * 处理数据库密码的密文转明文类 * @author newflypig * time:2015年10月30日 * TODO * */ public class DESHelper { /** * Description 根据键值进行解密 * @param data * @param key 加密键byte数组 * @return * @throws Exception */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // 生成一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密钥初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); return cipher.doFinal(data); } public static String decrypt(String data, String key) throws Exception { if (data == null) return null; BASE64Decoder decoder = new BASE64Decoder(); byte[] buf = decoder.decodeBuffer(data); byte[] bt = decrypt(buf, key.getBytes()); return new String(bt); } }
如需对加密算法有更深刻的了解,可以自行研究实现原理,对于敏捷开发这里只需要不求甚解的运用就行了,记得保护好你的key也就是密钥
一开始提到的需要将properties文件中的参数解开得到明文,想必你应该已经知道该使用哪种加密算法了吧
对了,就是上面的DES加密算法,这里只提供了解密,因为不需要在程序中提供加密函数
各位可以自己编写自己的加密函数,或者可以在自己的JUnit测试里面写加密的语句用来对数据库密码进行加密。