背景

规避数据库账号密码泄露风险, 项目中使用druid管理数据库,该连接池支持密码加密, 那么下面演示下加密的过程。

加密过程

确定项目使用druid版本

  1. 定位druid使用的版本, 图中显示版本是1.2.23

image.png

定位 com.alibaba.druid包在maven资源库的位置

我的maven资源库目录是D:\software\maven\repository, 那么druid包的全路径自然是D:\software\maven\repository\com\alibaba\druid\1.2.23

加密密码

  1. 执行加密

java -cp druid-1.2.23.jar com.alibaba.druid.filter.config.ConfigTools 换成你的密码

  1. 比如:密码是 Data_compass_123, 执行下面的命令将得到 加密后的密码,公钥,私钥
java -cp druid-1.2.23.jar com.alibaba.druid.filter.config.ConfigTools yourdatasoucepassswrod > yourdatasoucepassswrod_加密后的文档.txt

image.png

项目druid配置

  1. 配置加密后的密码

image.png

  1. 配置公钥

spring.datasource.druid.masterConnectProperties=config.decrypt=true;config.decrypt.key=上一步获取的publicKey

  1. 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);
}

  1. 启动成功,业务则胡南广场

总结

可以通过这个方式解密出密码ConfigTools.decrypt(String publicKeyText, String cipherText) , 这两个信息都暴漏在配置文件中, 后面可以引入nacos,公钥放入nacos。

如果是使用dynamic-datasource-spring-boot-starter项目的处理原理和这个项目类似,具体配置待补充。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐