druid 数据库密码加密
背景
规避数据库账号密码泄露风险, 项目中使用druid管理数据库,该连接池支持密码加密, 那么下面演示下加密的过程。
加密过程
确定项目使用druid版本
- 定位druid使用的版本, 图中显示版本是1.2.23
定位 com.alibaba.druid包在maven资源库的位置
我的maven资源库目录是D:\software\maven\repository, 那么druid包的全路径自然是D:\software\maven\repository\com\alibaba\druid\1.2.23
加密密码
- 执行加密
java -cp druid-1.2.23.jar com.alibaba.druid.filter.config.ConfigTools 换成你的密码
- 比如:密码是 Data_compass_123, 执行下面的命令将得到 加密后的密码,公钥,私钥
java -cp druid-1.2.23.jar com.alibaba.druid.filter.config.ConfigTools yourdatasoucepassswrod > yourdatasoucepassswrod_加密后的文档.txt
项目druid配置
- 配置加密后的密码
- 配置公钥
spring.datasource.druid.masterConnectProperties=config.decrypt=true;config.decrypt.key=上一步获取的publicKey
- DataSouce加密配置
数据罗盘项目是通过AbstractRoutingDataSource抽象类管理多数据源的项目, 所以需要在各个DataSouce被初始化的时候,进行激活ConfigFilter过滤器,进行解密
@Value("${spring.datasource.druid.masterConnectProperties}")
private String connectProperties;@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource(DruidProperties druidProperties) {DruidDataSource dataSource = DruidDataSourceBuilder.create().build();// 1.0 设置开启加密,加密的公钥的连接属性dataSource.setConnectionProperties(connectProperties);try {// 开启ConfigFilter,负责解密dataSource.setFilters("config");} catch (SQLException throwables) {throwables.printStackTrace();}return druidProperties.dataSource(dataSource);
}
- 启动成功,业务则胡南广场
总结
可以通过这个方式解密出密码ConfigTools.decrypt(String publicKeyText, String cipherText) , 这两个信息都暴漏在配置文件中, 后面可以引入nacos,公钥放入nacos。
如果是使用dynamic-datasource-spring-boot-starter项目的处理原理和这个项目类似,具体配置待补充。