数据库加密——DESUtil算法
目的:对项目中的数据库信息进行加密,此处加密数据库的用户名和密码。
步骤:
1.将数据库信息放入配置文件jdbc.properties中。
2.以引入的方式将数据库信息引入项目中,此处使用SSM框架,因此在Spring-dao.xml文件中引用。
注意:其中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. }