Druid 内置工具加密数据库密码概述数据库密码写在配置文件里但凡项目代码提交到 Git密码就跟着源码一起暴露了。即便是私有仓库任何一个有权限拉代码的人都能看到。而且运维交接、新人入职……知道密码的人越多泄露风险越大。Druid 连接池内置了一套加密工具可以让你在配置文件里只写密文应用启动时 Druid 自动解密后建立连接。最终效果配置文件的password从Hliu1026.变成eXGMzA/PwhC7/l2tThoxCVyD9v9Hd0po2R2GYfwzTu5iSlWlY/tgaOzJBm/HYxVd...应用启动后照样正常连接数据库。第一步生成密钥对并加密密码Druid 提供了ConfigTools工具类内嵌在druid的 jar 包里不需要额外依赖。写个单元测试跑一下TestSneakyThrowsvoidtestEncodePassword(){// 你的明文密码StringpasswordHliu1026.;// 生成密钥对512 位 RSA返回 [私钥, 公钥]String[]arrConfigTools.genKeyPair(512);StringprivateKeyarr[0];// 私钥——你保管好StringpublicKeyarr[1];// 公钥——放到配置文件里// 用私钥加密密码StringencodedPasswordConfigTools.encrypt(arr[0],password);log.info(privateKey: {},privateKey);log.info(publicKey: {},publicKey);log.info(encodedPassword: {},encodedPassword);}跑完之后控制台输出三样东西产出物用途放哪里私钥privateKey用来加密密码。以后改密码、新增数据库密码都拿它来加密你自己保管好不要进 Git公钥publicKeyDruid 启动时用来自动解密写到配置文件里密文encodedPassword代替明文密码写到配置文件的password字段ConfigTools.genKeyPair(512)的参数512是 RSA 密钥长度对密码加密够用了。第二步替换配置文件把生成的公钥和密文填到application.yml对应位置spring:datasource:url:jdbc:mysql://127.0.0.1:3306/idle_store?useUnicodetruecharacterEncodingutf-8...username:root# 原来password: Hliu1026.# 现在换成一串乱码password:eXGMzA/PwhC7/l2tThoxCVyD9v9Hd0po2R2GYfwzTu5iSlWlY/tgaOzJBm/HYxVd8zJOH4PSIDVV36mzqFSITgtype:com.alibaba.druid.pool.DruidDataSourcedruid:# ... 其他配置保持不变 ...# 告诉 Druid密码是加密的拿这把公钥去解密connection-properties:config.decrypttrue;config.decrypt.keyMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKLulduxIyZLzneseuSanUn0Go2IvX8lZX87HHyWsZPqnfpQoIA8XB6vZtXOk82LeCPXJd89OQs5Cr4yYzZcCAwEAAQconnection-properties里两项配置的含义配置项含义config.decrypttrue告诉 Druid密码字段是加密的需要先解密再用config.decrypt.key公钥用这把公钥来解密至此就完成了。应用启动时Druid 自动用公钥把密文解密成明文建立数据库连接。完整配置示例spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/idle_store?useUnicodetruecharacterEncodingutf-8autoReconnecttrueuseSSLfalseserverTimezoneAsia/Shanghaiusername:rootpassword:eXGMzA/PwhC7/l2tThoxCVyD9v9Hd0po2R2GYfwzTu5iSlWlY/tgaOzJBm/HYxVd8zJOH4PSIDVV36mzqFSITgtype:com.alibaba.druid.pool.DruidDataSourcedruid:initial-size:5min-idle:5max-active:20max-wait:60000test-while-idle:truetime-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000max-evictable-idle-time-millis:900000validation-query:SELECT 1 FROM DUALstat-view-servlet:enabled:trueurl-pattern:/druid/*login-username:adminlogin-password:adminfilter:stat:enabled:truelog-slow-sql:trueslow-sql-millis:2000merge-sql:true# 就这一行是新增的其他都是原来就有的connection-properties:config.decrypttrue;config.decrypt.keyMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKLulduxIyZLzneseuSanUn0Go2IvX8lZX87HHyWsZPqnfpQoIA8XB6vZtXOk82LeCPXJd89OQs5Cr4yYzZcCAwEAAQ加密到底在防什么有人可能会问公钥和密文都在配置文件里那拿到配置的人不一样能连上数据库吗是的光靠密文 公钥拿着这份配置去启动应用Druid 会自动解密数据库照连不误。所以这个加密防的不是别人拿到配置文件后去连库。它防的是密码扩散。明文密码被人看到他就知道了真实密码可以到处去试。密文就不一样了——别人看到 eXGMzA/PwhC7… 这串乱码他不知道明文是啥。退一步说他真想连上数据库光有密文还不够还得拿到数据库地址、用户名、连接权限白名单、账号权限等等。密码是整个链条里最关键的一环把它藏住了泄露的风险就砍掉了大半。