C3p0数据源的连接密码加密处理
1.首先,假设你已经配置好了spring项目
2.以下的配置添加到spring.xml(加密了userName和password):
-
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
-
<property name="driverClass" value="${jdbc.driver}" />
-
<property name="jdbcUrl" value="${jdbc.url}" />
-
<!-- <property name="user" value="${jdbc.username}" />
-
<property name="password" value="${jdbc.password}" /> -->
-
<!-- 指定自定义加密/解密的bean -->
-
<property name="properties" ref="dataSourcePropertiesCustomer"/>
-
<property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
-
<property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
-
<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
-
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
-
<property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
-
<property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
-
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
-
<property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
-
<property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}"/>
-
</bean>
-
<!-- 加密解密pw, 这的class指定了你的自定义类(加密解密 jdbc的密码) -->
-
<bean id="dataSourcePropertiesCustomer" class="com.util.EncryptedDataSourceFactory">
-
<property name="properties">
-
<props>
-
<prop key="user">${jdbc.username}</prop>
-
<prop key="password">${jdbc.password}</prop>
-
</props>
-
</property>
-
</bean>
3.以下是自定义的加密解密的类(直接复制就行,不用改,用的是Java自带的Base64算法)
-
package com.util;
-
import java.util.Base64;
-
import java.util.Properties;
-
import org.springframework.beans.factory.FactoryBean;
-
public class EncryptedDataSourceFactory implements FactoryBean<Object> {
-
private Properties properties;
-
public Object getObject() throws Exception {
-
return getProperties();
-
}
-
public Class<Properties> getObjectType() {
-
return java.util.Properties.class;
-
}
-
public boolean isSingleton() {
-
return true;
-
}
-
public Properties getProperties() {
-
return properties;
-
}
-
public void setProperties(Properties inProperties) {
-
this.properties = inProperties;
-
String originalUsername = properties.getProperty("user");
-
String originalPassword = properties.getProperty("password");
-
if (originalUsername != null){
-
String newUsername = decryptDESUsername(originalUsername);
-
properties.put("user", newUsername);
-
}
-
if (originalPassword != null){
-
String newPassword = decryptDESPassword(originalPassword);
-
properties.put("password", newPassword);
-
}
-
}
-
private String decryptDESUsername(String originalUsername) {
-
return decryptDES(originalUsername);
-
}
-
private String decryptDESPassword(String originalPassword) {
-
return decryptDES(originalPassword);
-
}
-
/**
-
* 解密
-
*
-
* @param data
-
* 原始数据
-
* @return 加密后的数据
-
*/
-
public String decryptDES(String data) {
-
try {
-
byte[] key = Base64.getDecoder().decode(data);
-
return new String(key, "UTF-8");
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return null;
-
}
-
/**
-
* 加密
-
*
-
* @param data
-
* 原始数据
-
* @return 加密后的数据
-
*/
-
public String encryptDES(String data) {
-
try {
-
String key = Base64.getEncoder().encodeToString(data.getBytes("UTF-8"));
-
return key;
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return null;
-
}
-
}
4.假设你密码是123456和用户名abc,先测试获取加密的密码和用户名:
然后写到你的配置文件里面就行了,像这样:
5.像这样以后要改连接的密码 可以添加测试类来先加密,再修改配置文件即可。
参考:1.c3p0明文密码加密:https://blog.****.net/tanglei6636/article/details/70143199
2.Java自带的加密解密算法:https://blog.****.net/hqm12345qw/article/details/79804295?utm_source=blogxgwz8
原文地址:https://blog.****.net/BAStriver/article/details/86544341