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.csdn.net/tanglei6636/article/details/70143199

2.Java自带的加密解密算法:https://blog.csdn.net/hqm12345qw/article/details/79804295?utm_source=blogxgwz8

猜你喜欢

转载自blog.csdn.net/BAStriver/article/details/86544341