Druid RSA 加密 / 解密
浏览器本地处理为 Alibaba Druid 数据源生成密码密文,或使用公钥还原已有配置。支持多个历史版本、默认密钥与自定义密钥。
查看加密原理与版本差异 ↓密码、密钥与结果只保留在当前页面内存中,不会发送到工具服务端,也不会写入本地存储。刷新或离开页面后需重新输入。
Druid RSA 加解密原理
ConfigTools 将数据库密码编码为 UTF-8,按 RSA PKCS#1 v1.5 的 type 1 规则填充,再使用私钥执行 RSA 运算,最后输出 Base64。数据源启动时,ConfigFilter 使用配置中的公钥解密,将还原的密码交给数据库驱动。
为什么普通 RSA 工具可能不兼容?
常见 RSA 加密使用公钥加密、私钥解密;Druid 使用相反的密钥方向,并且不进行消息哈希。使用 RSA-OAEP、标准带哈希的签名,或拼接多段 RSA 密文,均不能直接替代 ConfigTools 的输出。相同私钥和相同密码在这些版本中会得到相同密文。
密文能保护到什么程度?
这种方式主要用于避免配置文件直接出现明文。持有配套公钥的人可以还原密码,公钥与密文放在一起并不能防止配置泄露后的解密。私钥无需放到运行配置中;生产环境仍应控制配置访问权限,并结合密钥管理服务管理凭据。
为什么有密码长度限制?
单个 RSA 块最多容纳「密钥字节数 − 11」个明文字节:512 位为 53 字节,1024 位为 117 字节,2048 位为 245 字节。中文通常占 3 个 UTF-8 字节,表情可能占 4 个;本页按字节检查,超长时请使用更长的密钥。
解密失败时检查什么?
确认密文完整,公钥来自同一次密钥生成,并已启用 ConfigFilter 和 config.decrypt=true。只有使用内置默认私钥加密的内容才能用默认公钥解密。历史版本解密使用 JVM 默认字符集;含中文密码时,应确认原项目运行在 UTF-8 字符集下。
多版本兼容说明
以下为已核对的具体版本。版本选择用于展示对应行为,密文没有版本标记;这些版本使用相同的密钥对时可以互相解密。所列版本是兼容目标,不代表依赖升级建议。
| 版本 | ConfigTools.main 行为 | 源码中的 Cipher | 官方源码 | JAR 下载 |
|---|---|---|---|---|
| 1.0.15 | 使用内置默认密钥,仅输出密文 | RSA(SunJCE 下为 PKCS1Padding) | ConfigTools ↗ | 下载 ↗镜像 ↗ |
| 1.0.16 | 新建 512 位密钥对,输出私钥、公钥与密文 | RSA(SunJCE 下为 PKCS1Padding) | ConfigTools ↗ | 下载 ↗镜像 ↗ |
| 1.1.24 | 新建 512 位密钥对,输出私钥、公钥与密文 | RSA/ECB/PKCS1Padding | ConfigTools ↗ | 下载 ↗镜像 ↗ |
| 1.2.23 | 新建 512 位密钥对,输出私钥、公钥与密文 | RSA/ECB/PKCS1Padding | ConfigTools ↗ | 下载 ↗镜像 ↗ |
| 1.2.27 | 新建 512 位密钥对,输出私钥、公钥与密文 | RSA/ECB/PKCS1Padding | ConfigTools ↗ | 下载 ↗镜像 ↗ |
1.0.15 / 1.0.16 的简写 RSA 按常见 Oracle / OpenJDK SunJCE 提供者解释为 RSA/ECB/PKCS1Padding;其他 JCE 提供者需核对默认填充。后续所列版本显式声明该填充。各版本的 encrypt(String) / decrypt(String) API 仍可使用内置默认密钥。
在项目中用同版本 JAR 核对
java -cp druid-1.2.27.jar com.alibaba.druid.filter.config.ConfigTools "示例密码"
1.0.16 及以上所列版本每次运行命令都会生成新的密钥对,不能拿不同运行生成的公钥解密。项目采用重打包、修改版或其他版本时,以实际 JAR 的 ConfigTools 实现为准。