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 不生效。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
立即学习“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,密文就只是个长得像密码的字符串。

















