Druid提供RSA/AES加密方案实现数据库密码密文存储与运行时自动解密,通过ConfigTools生成密钥和密文,配置中存密文、启动时解密,兼顾安全性与低侵入性,适用于开发测试及生产环境。

Java 中 JDBC 连接的数据库密码不能明文写在配置文件里,否则代码一提交、配置一泄露,数据库就等于裸奔。核心思路是:配置中存密文,运行时自动解密再交给数据源——不是“不暴露”,而是“暴露了也用不了”。
用 Druid + ConfigTools 做轻量级加解密
这是 Spring Boot 项目中最常用、侵入性最小的方式,适合开发和测试环境快速落地:
- 用 Druid 自带的
ConfigTools.encrypt()对明文密码加密(生成公私钥对,私钥由工具类内部管理) - 把加密结果填进
application.yml或application.properties,例如:spring.datasource.password=KQV6Zk...(一长串密文) - 自定义一个继承
DruidDataSource的类,重写setPassword()方法,在设值前调用ConfigTools.decrypt()解密 - 启动时 Spring 会注入这个定制数据源,全程对业务代码透明
用 AES 对称加密控制密钥生命周期
比 Druid 默认方案更可控,适用于需要统一密钥管理或对接 KMS 的场景:
- 密钥建议通过系统环境变量或启动参数传入(如
-Dapp.aes.key=MySecretKey123),避免硬编码 - 加密工具类使用
AES/CBC/PKCS5Padding模式,必须保存初始化向量(IV)并和密文一起存储(常见做法是 Base64 合并:base64(IV)+":"+base64(cipher)) - 配置中存完整密文字符串,解密逻辑封装在
DataSource初始化前的@PostConstruct方法或自定义PropertySource中 - 注意 JDK 版本兼容性:AES-256 需开启 JCE 无限制策略(JDK 8u161+ 和 JDK 11+ 默认支持)
用 Spring Cloud Config 或 Vault 做集中式凭据管理
面向生产环境,解决“密钥谁来管、改了怎么同步、权限如何分”的问题:
立即学习“Java免费学习笔记(深入)”;
- 把数据库密码从应用配置中彻底剥离,交由 Spring Cloud Config Server(配合 Git 加密仓库)或 HashiCorp Vault 托管
- 应用启动时通过 HTTP 请求凭 Token 拉取解密后的密码,Vault 还支持动态数据库凭证(每次连接生成临时账号,用完即废)
- 需配合 Spring Boot 的
@ConfigurationProperties+@RefreshScope实现运行时刷新(但密码变更通常需重启数据源) - 运维成本略高,但安全水位明显提升,适合金融、政务等强合规要求系统
别踩这些坑
很多团队做了加密,却因细节翻车:
- MD5/SHA 类哈希不适用:它们是单向不可逆的,而 JDBC 需要还原出原始密码去认证,哈希只适合用户密码存储
- 密钥写死在代码里等于没加密:哪怕用了 AES,如果密钥是字符串常量,反编译一下就全暴露
-
日志打印明文密码:检查是否启用了
druid.stat.mergeSql=true或 MyBatis 的logImpl=STDOUT_LOGGING,避免解密后被意外记录 -
忽略传输层加密:配置加密只防静态泄露,连接建立后仍需开启 MySQL 的
useSSL=true&requireSSL=true防中间人窃听


















