druid实现数据库密码加密功能
数据库密码直接写在配置中,对运维安全来说,是一个很大的挑战。可以使用Druid为此提供一种数据库密码加密的手段ConfigFilter。
如果项目已经集成druid,只需按要求配置即可。
1、执行命令加密数据库密码
找到druid-1.2.20.jar所在的文件夹目录,执行cmd命令,然后执行下面的命令生成数据库密码的密文和秘钥对。
java -cp druid-1.2.20.jar com.alibaba.druid.filter.config.ConfigTools 数据库密码
命令最后的参数一定要输入你的数据库密码,版本号视情况而定,我们这边使用的是druid-1.2.20版本。
命令输出的是加密后的结果,主要关注publicKey和password。
2、配置数据源
2.1、password属性修改成加密结果里的password值,即数据库密码的密文。
password: KWddMcILCrnt6GXmhct33cgL+paOLt7TE0c2DIzEhQi3/MP+2ke2LfbHfgpvccP2AUX8GgzCl4iMNF4o/yypQg==
2.2、启用过滤器configFilter
filter:
config:
# 启用过滤器configFilter,config下面只有enabled一个属性
enabled: true
2.3、配置config下面相关属性
config.decrypt为解密开关
config.decrypt.key为解密公钥
connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOAuSzGYufWFSDIpd3A5Mmv1UxAhcNT5hUCl8RLxtSXR+3H5r4T26OD+99VqPyF+EqwDJptmJZz4sDcK7fvANsCAwEAAQ==
2.3、启动应用程序测试验证加密结果
如若忘记密码可以使用工具类解密(传入生成的公钥+密码)
public static void main(String[] args) throws Exception {
String password = ConfigTools.decrypt(
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOAuSzGYufWFSDIpd3A5Mmv1UxAhcNT5hUCl8RLxtSXR+3H5r4T26OD+99VqPyF+EqwDJptmJZz4sDcK7fvANsCAwEAAQ==",
"KWddMcILCrnt6GXmhct33cgL+paOLt7TE0c2DIzEhQi3/MP+2ke2LfbHfgpvccP2AUX8GgzCl4iMNF4o/yypQg==");
System.out.println("解密密码:" + password);
}
3、多数据源情况下配置
需要配置的属性如下:
- spring.datasource.dynamic.druid.public-key:数据库密文密码解密的公钥,如果使用了public-key,需要配置connection-properties属性(只要含有connection-properties属性即可,不必含有config.decrypt和config.decrypt.key配置,因为底层代码已经自动加上了)
- spring.datasource.dynamic.datasource.master.password:数据库密码的密文
具体配置如下