生成加密密码
集成了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: user1password: ${password}type: com.alibaba.druid.pool.DruidDataSourcedruid:filters: config,stat,wall,log4j2connection-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格式,--这样的注释不通过会报错