数据库加密——DESUtil算法

目的:对项目中的数据库信息进行加密,此处加密数据库的用户名和密码。

步骤:

1.将数据库信息放入配置文件jdbc.properties中。

java中数据库ENC解密代码 java 数据库加密_字段


2.以引入的方式将数据库信息引入项目中,此处使用SSM框架,因此在Spring-dao.xml文件中引用。

java中数据库ENC解密代码 java 数据库加密_Java加密数据库信息_02


注意:其中com.zy.utils.EncryptPropertyPlaceholderConfigurer会关联到后续的PropertyPlaceholderConfigurer,这个类中会自动加载到引入的配置文件信息。

3.使用DESUtil工具类编写加密解密算法

1.	/** 
2.	 * 对关键配置信息进行DES加密算法 
3.	 * (对数据库密码加密解密算法) 
4.	 */  
5.	public class DESUtil {  
6.	  
7.	    private static Key key;  
8.	    //设置密钥  
9.	    private static String KEY_STR = "myKey";  
10.	    private static String CHARSET_NAME = "UTF-8";  
11.	    private static String ALGORITHM = "DES";  
12.	  
13.	    //利用静态代码块生成DES算法的实例  
14.	    static {  
15.	        try{  
16.	            //生成DES算法对象  
17.	            KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);  
18.	            //运用SHA1安全策略  
19.	            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");  
20.	            //设置上密钥种子  
21.	            secureRandom.setSeed(KEY_STR.getBytes());  
22.	            //初始化基于SHA1的算法对象  
23.	            generator.init(secureRandom);  
24.	            //生成密钥对象  
25.	            key = generator.generateKey();  
26.	            generator = null;  
27.	        }catch (Exception e){  
28.	            throw  new RuntimeException(e);  
29.	        }  
30.	    }  
31.	  
32.	  
33.	    /** 
34.	     * 获取加密后的信息 
35.	     */  
36.	    public static String getEncryptString(String str){  
37.	        //基于BASE64编码,接收byte[]并转换成String  
38.	        BASE64Encoder base64Encoder = new BASE64Encoder();  
39.	        try {  
40.	            //按UTF-8编码  
41.	            byte[] bytes = str.getBytes(CHARSET_NAME);  
42.	            //获取加密对象  
43.	            Cipher cipher = Cipher.getInstance(ALGORITHM);  
44.	            //初始化密码信息  
45.	            cipher.init(Cipher.ENCRYPT_MODE,key);  
46.	            //加密  
47.	            byte[] doFinal = cipher.doFinal(bytes);  
48.	            //byte[] to encode好的String并返回  
49.	            return base64Encoder.encode(doFinal);  
50.	        } catch (Exception e) {  
51.	            throw  new RuntimeException(e);  
52.	        }  
53.	    }  
54.	  
55.	  
56.	    /** 
57.	     * 获取解密之后的信息 
58.	     */  
59.	    public static String getDecryptString(String str){  
60.	        //基于BASE64编码,接收byte[]并转换成String  
61.	        BASE64Decoder base64Decoder = new BASE64Decoder();  
62.	        try {  
63.	            //将字符串decode成byte[]  
64.	            byte[] bytes = base64Decoder.decodeBuffer(str);  
65.	            //获取解密对象  
66.	            Cipher cipher = Cipher.getInstance(ALGORITHM);  
67.	            //初始化解密信息  
68.	            cipher.init(Cipher.DECRYPT_MODE,key);  
69.	            //解密  
70.	            byte[] doFinal = cipher.doFinal(bytes);  
71.	            //返回解密之后的信息  
72.	            return new String(doFinal,CHARSET_NAME);  
73.	        } catch (Exception e) {  
74.	            throw  new RuntimeException(e);  
75.	        }  
76.	    }}

4.加密用户名和密码
(1)编写一个main方法利用DESUtil中的加密方法getEncryptString()对原有信息进行加密。(用完就把main方法删掉,自己知道密码就可)
(2)用(1)得到加密后的信息,在对应的properties文件中填写到对应的位置。
5.编写方法定位加密字段及解密已被加密的字段
此作用就是将加密信息翻译成真实的密码,从而连接数据库。
*步骤:
(1)设置加密的字段。
(2)编写方法EncryptPropertyPlaceholderConfigurer()继承 PropertyPlaceholderConfigurer。

1.	/** 
2.	 * 解密信息类 
3.	 */  
4.	public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {  
5.	    //需要加密的字段数组  
6.	    private String[] encryptPropNames = {"jdbc.username","jdbc.password"};  
7.	  
8.	    /** 
9.	     *对关键的属性进行转换 
10.	     */  
11.	    //propertyName为字段键,propertyValue为字段值  
12.	    protected String convertProperty(String propertyName,String propertyValue){  
13.	        if (isEncryptProp(propertyName)){  
14.	            //对已加密的字段进行工作  
15.	            String decryptValue = DESUtil.getDecryptString(propertyValue);  
16.	            return decryptValue;  
17.	        }else {  
18.	            return propertyValue;  
19.	        }  
20.	    }  
21.	  
22.	    /** 
23.	     * 判断属性是否已加密 
24.	     */  
25.	    private boolean isEncryptProp(String propertyName) {  
26.	        //若等于需要加密的字段,则进行加密  
27.	        for (String encryptPropName : encryptPropNames){  
28.	            if (encryptPropName.equals(propertyName)){  
29.	                return true;  
30.	            }  
31.	        }  
32.	        return false;  
33.	    }  
34.	}