生成加密密码
集成了druid链接池的,可以实现数据源密码加密。加密方式如下
构建单元测试,并输入密码即可生成加密密码以及加密公钥
@Test
public void testPwd() throws Exception {
String password = "123456";
String[] arr = com.alibaba.druid.filter.config.ConfigTools.genKeyPair(512);
System.out.println("privateKey:" + arr[0]);
System.out.println("publicKey:" + arr[1]);
System.out.println("password:" + com.alibaba.druid.filter.config.ConfigTools.encrypt(arr[0], password));
}
将生成的 password 和 publickey 记录下来,后面配置中将要使用
springboot项目只需要配置yml文件
spring:
datasource:
url: ....
username: user1
password: ${password}
type: com.alibaba.druid.pool.DruidDataSource
druid:
filters: config,stat,wall,log4j2
connection-properties: config.decrypt=true;config.decrypt.key=${publicKey}
...
配置说明:
- ${password}: 加密后的密码
- ${publicKey}: 根据密码生成的公钥
- filters:config : 配置链接其过滤器 config,用于加密数据库密码
SSM框架项目修改配置文件 properties
spring.datasource.password = ${password}
spring.datasource.druid.filters = config,stat,wall,log4j2
spring.datasource.druid.connection-properties = config.decrypt=true;config.decrypt.key=${publicKey}
配置说明:
- ${password}: 加密后的密码
- ${publicKey}: 根据密码生成的公钥
- filters:config : 配置链接其过滤器 config,用于加密数据库密码
验证
直接启动程序,访问数据正常即可。
核心原理介绍
DruidDataSource 链接池在获取链接时会调用一个初始化方法 init:
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
init();
if (filters.size() > 0) {
FilterChainImpl filterChain = new FilterChainImpl(this);
return filterChain.dataSource_connect(this, maxWaitMillis);
} else {
return getConnectionDirect(maxWaitMillis);
}
}
init 方法遍历 filters 列表,并逐个初始化。
在Druid中有一个 ConfigFilter,该 filter 用于对链接池加密、解密处理。
注意事项:filters加上wall配置会严格校验sql格式,--这样的注释不通过会报错