Jasypt是主流方案,通过ENC()密文与环境变量密钥实现启动自动解密,业务无感;密钥严禁硬编码,须用环境变量或启动参数注入,且生成与运行时算法、密钥必须一致。

Java 中数据库连接池对敏感密码加密配置,核心不是“选哪种算法”,而是“谁来解密”和“密钥怎么管”。只要解密时机和密钥传递方式设计得当,密码在配置文件里就始终是密文,启动时自动还原,业务代码完全无感。
用 Jasypt 实现全自动解密(推荐通用方案)
这是目前最主流、侵入性最小的方式。它不绑定具体连接池,HikariCP、Druid、DBCP 都能用。
- 引入依赖:
com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4(注意版本,2.x 与 Spring Boot 2.7+ 不兼容) - 配置文件中写密文:
spring.datasource.password=ENC(v1R8Kx9LmQaZy2Bn...)(ENC() 包裹,jasypt 启动时自动识别并解密) - 密钥绝不硬编码:
✅ 推荐用环境变量:JASYPT_ENCRYPTOR_PASSWORD=your_real_secret_key
✅ 或启动参数:java -jar app.jar --jasypt.encryptor.password=your_real_secret_key
❌ 禁止写死在 application.yml 里 - 密文生成建议用命令行工具或测试接口,确保生成时用的密钥、算法(默认 PBEWithMD5AndDES)与运行时一致
用 Druid 自带加密能力(适合已用 Druid 的项目)
Druid 提供了原生支持,本质是通过 config.filter 在创建连接前解密 password 字段,无需额外依赖。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 启用加密过滤器:
druid.filters=config - 配置公钥(用于加密)和私钥(用于解密),通常用 RSA;也可用 AES,但需自行管理密钥和 IV
- 密码字段写成加密后 base64 字符串,例如:
spring.datasource.password=U2FsdGVkX1+... - 关键点:必须实现
DruidDataSource.setFilters("config"),并配置connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK... - 优势是与 Druid 深度集成;缺点是只适用于 Druid,且配置稍复杂,密钥管理仍需谨慎
自己封装加解密逻辑(适合有定制需求的场景)
如果项目对算法、密钥轮换或审计日志有特殊要求,可基于 AES/CBC/PKCS5Padding 自研工具类,但要注意几个硬性约束:
立即学习“Java免费学习笔记(深入)”;
- 解密动作必须发生在连接池初始化之前,比如重写
DruidDataSource.setConnectionProperties()或在HikariConfig构造后、HikariDataSource实例化前完成 - 密钥不能出现在代码或配置文件中,应通过系统属性、环境变量或 K8s Secret 注入
- 避免使用固定 IV(如全零或硬编码字符串),建议每次加密随机生成并和密文一起存储(如拼接或存入独立配置项)
- 不要用 MD5/SHA 等单向哈希——它们不可逆,数据库连接需要的是可解密的密码
关键提醒:加密 ≠ 安全,密钥才是命门
无论用哪种方式,以下三点一旦出错,加密就等于没做:
- 密钥泄露:开发环境用临时密钥可以,上线必须用强随机密钥,并通过运维渠道注入
- 密文错配:生成密文时用的密钥、算法、填充方式,和运行时 jasypt 或 Druid 解密时的配置必须严格一致
- 日志泄漏:确认应用日志不会打印原始密码或密钥(检查 logback/slf4j 配置,禁用敏感字段 trace 输出)

















