Druid密文密码需同时满足三条件才能解密:使用DruidDataSource、配置config.decrypt=true(URL或connection-properties中)、密码由EncryptUtils加密;否则报Access denied。

Druid 支持明文密码直连,也支持密文配置自动解密——但必须满足两个硬性条件:使用 DruidDataSource(不是 DriverManager),且密码字段必须带 config.decrypt=true 参数,否则哪怕你填了密文,它也会当成普通字符串报 Access denied 错误。
连接字符串里必须显式启用解密开关
MySQL 的 JDBC URL 本身不参与密码解密逻辑,真正触发 Druid 解密行为的是连接池初始化时的配置项。很多人把加密密码直接塞进 spring.datasource.password 就以为能用,结果启动失败。关键点是:必须在 URL 或独立配置中带上 config.decrypt=true,否则 EncryptUtils.encrypt("xxx") 生成的密文不会被识别。
-
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC—— 这种写法不管密码多密,都无效 - 正确写法之一(URL 内嵌):
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&config.decrypt=true - 更推荐写法(配置分离):在
application.yml中额外加一行spring.datasource.druid.connection-properties: config.decrypt=true
加密密码必须用 Druid 自带的 EncryptUtils 生成
别自己用 AES 工具随便加密,Druid 的解密只认它自己 EncryptUtils 的输出格式,而且密钥固定为 druid-public-key(除非你手动覆盖)。常见错误是拿在线 Base64 工具或别的库加密,结果 getConnection() 报 java.lang.IllegalArgumentException: decrypt error。
- 运行一次加密代码获取密文(注意 JDK 版本兼容性,JDK 17+ 需确认
druid版本 ≥ 1.2.16):String pwd = EncryptUtils.encrypt("myPass123"); System.out.println(pwd); // 输出类似:eBfZcQw...(很长一串) - 密文必须完整粘贴到配置中,不能删空格、换行或截断
- 如果要用自定义公钥,得同时配置
config.decrypt.key和config.decrypt.key.pub,但绝大多数项目没必要
Spring Boot 下配置项名称容易混淆
Spring Boot 2.x/3.x 对 Druid 的自动配置路径有差异,尤其在 starter 版本升级后,spring.datasource.password 和 spring.datasource.druid.password 不是等价的。如果你用了 druid-spring-boot-starter,密码字段必须放在 spring.datasource.druid.password 下,否则 config.decrypt=true 不生效。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 错误示范(被忽略):
spring: datasource: password: eBfZcQw... - 正确写法(starter 场景):
spring: datasource: druid: url: jdbc:mysql://... username: root password: eBfZcQw... connection-properties: config.decrypt=true - 纯
DruidDataSource手动配置则无所谓,直接调setPassword()即可,但必须先调setConnectionProperties("config.decrypt=true")
验证解密是否成功最简单的办法
不要等接口报错才排查。启动时加一个日志钩子,看 Druid 是否真的解出了明文密码:
- 在
DruidDataSource初始化后、init()前,加一句:dataSource.setTestOnBorrow(true); dataSource.setValidationQuery("SELECT 1");如果连接能通过验证查询,说明解密成功;如果抛Access denied for user,基本就是密文或开关没配对 - 更直接的办法:启动参数加
-Ddruid.log.enable=true,然后 grep 日志里的decrypt password关键字,能看到解密前后的对比 - 注意:
config.decrypt=true必须在init()之前设置,设晚了等于没设
密文配置不是“设了就安全”,而是“设错就完全连不上”。真正容易被忽略的点是:URL 参数、connection-properties、配置层级三者必须严格对齐,缺一不可。任何一处漏掉 config.decrypt=true,密文就只是个长得像密码的字符串。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










