SpringBoot使用MySQL在多种连接池上密码加密

如何配置数据库密码加密访问数据库?

    • 实现原理
    • 两种连接池的实现
      • DBCP连接池
      • Druid连接池


实现原理

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密操作,达到成功创建连接池的目的。


两种连接池的实现

  • DBCP连接池
  • Druid连接池

DBCP连接池

配置数据库属性文件database.properties, 配置数据库连接的密码(jdbc.password)设置为加密后的值,该值可以采用AES、DES、3DES等对称加密方式实现,也可以采用RSA的加密算法存储~
原文地址:https://my.oschina.net/wangmengjun/blog/1588790.

  1. 配置属性参数:
// database.properties
# jdbc数据库驱动名称(MySQL)
jdbc.driverClassName=com.mysql.jdbc.Driver

# 数据库连接的URL、username和password(密文)
jdbc.url=jdbc:mysql://127.0.0.1:3306/MyProject?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=abc
jdbc.password=YpIADNvyi+/X2O33wS5E9SaEVKZgKuS70X8kgxgioEJ7+7KccS8aVmFIWndJ83NsUebDkb+w94HM3xCyjnjg4Q==

# Time to wait for an open connection before timing out
# (in milliseconds)
cpool.checkoutTimeout=5000

# Connection pool size
cpool.minPoolSize=10
cpool.maxPoolSize=50

# How long to keep unused connections around(in seconds)
# Note: MySQL times out idle connections after 8 hours(28,800 seconds)
# so ensure this value is below MySQL idle timeout
cpool.maxIdleTime=25200

# How long to hang on to excess unused connections after traffic spike
# (in seconds)
cpool.maxIdleTimeExcessConnections=1800

# Acquiring new connections is slow, so eagerly retrieve extra connections
# when current pool size is reached
cpool.acquireIncrement=10
  1. 自定义数据源(CustomDataSource
import org.apache.commons.codec.binary.Base64;

/**
 * @author luzhichao
 * @date 2019年8月28日 上午11:53:40
 */
public class CustomDataSource extends org.apache.commons.dbcp.BasicDataSource {

    public CustomDataSource() {
        super();
    }

    @Override
    public void setPassword(String password) {
        try {
        	//用Base64加密password
            String decodePassword =  new String(Base64.decodeBase64(password.getBytes()));
            this.password =decodePassword;
        } catch (Exception e) {
        }
    }

}
  1. 修改been为dataSource的class引用路径
<bean id="dataSource" class="com.xxx.datasource.CustomDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 可同时连接的最大的连接数 -->
		<property name="maxActive" value="60" />
		<!-- 最大的空闲的连接数 -->
		<property name="maxIdle" value="60" />
		<!-- 最小的空闲的连接数,低于这个数量会被创建新的连接,默认为0 -->
		<property name="minIdle" value="5" />
		<!-- 连接池启动时创建的初始化连接数量,默认值为0 -->
		<property name="initialSize" value="1" />
		<!-- 等待连接超时时间,毫秒,默认为无限 -->
		<property name="maxWait" value="30000" />
	</bean>

配置文件配置dataSource的地方,将org.apache.commons.dbcp.BasicDataSource改写成自定义连接池类名即可(如:com.xxx.datasource.CustomDataSource)~

Druid连接池

  1. 配置application.properties
// spring配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
# 加密后的密码(原密码 123456)
spring.datasource.password=WVMjPhfXQrIsWRo0/RCqAVvYtTU9WNVToKJohb8AlUmHwnV6vwFL+FM2CNFDMJwGHW1iCmyaUlF+sgvFdogqEA==
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置 connection-properties,启用加密。
spring.datasource.druid.connection-properties=config.decrypt=true
# 启动ConfigFilter
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.filters=config
...

主要是通过com.alibaba.druid.filter.config.ConfigTools完成RSA的加解密功能,有兴趣的朋友可以了解一下它的源码。

  1. 填写密文密码
// 测试
public class ConfigToolsTest {

    public static void main(String[] args) throws Exception {
       String password = "abc123123";
       String encodePassword =  ConfigTools.encrypt(password);
       System.out.println("明文密码: " + encodePassword);
       System.out.println("密文密码: " + ConfigTools.decrypt(encodePassword));
    }
}

先看这篇文章,如何生成加密后的密码及秘钥:链接

你可能感兴趣的:(知识收集库)