数据源的加密解密

Posted 沐浴春风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据源的加密解密相关的知识,希望对你有一定的参考价值。

先来看一下数据库配置文件:

dbCustomer.driverClass=org.gjt.mm.mysql.Driver
dbCustomer.jdbcUrl=jdbc:mysql://192.168.1.81:3306/p2p_customer?useUnicode=true&characterEncoding=UTF8
dbCustomer.user=PCVoqoFQn5w=     加密后的用户名
dbCustomer.password=eh1IPqyJjLs=  加密后的密码
#
dbCustomer.initialPoolSize=10
dbCustomer.maxIdleTime=60
dbCustomer.maxPoolSize=50
dbCustomer.minPoolSize=10
#
dbCustomer.acquireIncrement=3
dbCustomer.acquireRetryDelay=1000
dbCustomer.acquireRetryAttempts=30
dbCustomer.breakAfterAcquireFailure=false

applicationContext.xml 中的C3P0中的配置如下:

 <!-- 数据库连接池管理 -->
    <bean id="c3p0DataSourceCustomer" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${dbCustomer.driverClass}"/>
        <property name="jdbcUrl" value="${dbCustomer.jdbcUrl}"/>
        <!-- <property name="user" value="${dbCustomer.user}"/>
        <property name="password" value="${dbCustomer.password}"/> -->
        <property name="properties" ref="dataSourcePropertiesCustomer"/> 

        <property name="initialPoolSize" value="${dbCustomer.initialPoolSize}"/>
        <property name="maxIdleTime" value="${dbCustomer.maxIdleTime}"/>
        <property name="maxPoolSize" value="${dbCustomer.maxPoolSize}"/>
        <property name="minPoolSize" value="${dbCustomer.minPoolSize}"/>
        <property name="acquireIncrement" value="${dbCustomer.acquireIncrement}"/>
        <property name="acquireRetryDelay" value="${dbCustomer.acquireRetryDelay}"/>
        <property name="acquireRetryAttempts" value="${dbCustomer.acquireRetryAttempts}"/>
        <property name="breakAfterAcquireFailure" value="${dbCustomer.breakAfterAcquireFailure}"/>
    </bean>
<bean id="dataSourcePropertiesCustomer" class="com.hzfh.service.EncryptedDataSourceFactory"> <property name="properties"> <props> <prop key="user">${dbCustomer.user}</prop> <prop key="password">${dbCustomer.password}</prop> </props> </property> </bean>

项目启动加载时,会自动找到 com.hzfh.service.EncryptedDataSourceFactory 类,并且 用户名:user、密码:password 传入到该类中进行解密

 1 package com.hzfh.service.EncryptedDataSourceFactory;
 2 import java.io.UnsupportedEncodingException;
 3 import java.util.Properties;
 4 
 5 import org.springframework.beans.factory.FactoryBean;
 6 
 7 import com.hzframework.encrypt.DESEncoder;
 8 import com.hzframework.encrypt.Encoder;
 9   
10 public class EncryptedDataSourceFactory implements FactoryBean {  
11   
12     private Properties properties;  
13       
14     public Object getObject() throws Exception {  
15         return getProperties();  
16     }  
17   
18     public Class getObjectType() {  
19         return java.util.Properties.class;  
20     }  
21   
22     public boolean isSingleton() {  
23         return true;  
24     }  
25   
26     public Properties getProperties() {  
27         return properties;  
28     }  
29   
30     public void setProperties(Properties inProperties) {  
31         this.properties = inProperties;  
32         String originalUsername = properties.getProperty("user");  
33         String originalPassword = properties.getProperty("password");  
34         if (originalUsername != null){  
35             String newUsername = decryptDESUsername(originalUsername);  
36             properties.put("user", newUsername);  
37         }  
38         if (originalPassword != null){  
39             String newPassword = decryptDESPassword(originalPassword);  
40             properties.put("password", newPassword);  
41         }  
42     }  
43       
44     private String decryptDESUsername(String originalUsername){  
45         return decryptDES(originalUsername);  
46     }  
47       
48     private String decryptDESPassword(String originalPassword){  
49         return decryptDES(originalPassword);  
50     }  
51     /**
52      * 解密
53      * @param data 原始数据
54      * @return 加密后的数据
55      */
56     public  String decryptDES(String data) {
57         try {
58             String key = "GWWEEuUvhV4=";
59             byte[] bytes = Encoder.decryptBASE64(data);
60             return new String(DESEncoder.decrypt(bytes, key));
61         } catch (Exception e) {
62             e.printStackTrace();
63         }
64         return null;
65     }
66     /**
67      * 加密
68      * @param data 原始数据
69      * @return 加密后的数据
70      */
71     public  String encryptDES(String data) {
72         try {
73             String key ="GWWEEuUvhV4=";
74             byte[] bytes = toByteArray(data);
75             return Encoder.encryptBASE64(DESEncoder.encrypt(bytes, key));
76         } catch (Exception e) {
77             e.printStackTrace();
78         }
79         return null;
80     }
81     private  byte[] toByteArray(String str) throws UnsupportedEncodingException {
82         return str.getBytes("UTF-8");
83     }
84   
85 }  

上述com.hzfh.service.EncryptedDataSourceFactory类需要继承FactoryBean ,同时里面的加密、解密算法就要根据自己项目中的加密解密去写了,可以参考上一篇文章

对用户名、密码加密时,我用到了单元测试 直接生产加密后的字符串

 1     @Test
 2     public void getEncrypt(){
 3             try {
 4                 String key ="GW0EYuUvhV4=";
 5                 byte[] bytes = toByteArray("123456");
 6                 System.out.println(Encoder.encryptBASE64(DESEncoder.encrypt(bytes, key)));
 7             } catch (Exception e) {
 8                 e.printStackTrace();
 9             }
10     }
11     private  byte[] toByteArray(String str) throws UnsupportedEncodingException {
12         return str.getBytes("UTF-8");
13     }

输出:eh1IPqyJjLs=

这样数据源就可以进行密文显示了,同时不影响数据库的连接。

 

以上是关于数据源的加密解密的主要内容,如果未能解决你的问题,请参考以下文章

论如何设计一款端对端加密通讯软件

Laravel基本使用

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

解密体育背后AI黑科技:花样滑冰动作识别多模视频分类和精彩片段剪辑