1. 背景与问题场景
作为一名长期与数据库打交道的开发者,我经常遇到这样的尴尬场景:某个项目的数据库连接密码忘记了,但好在Navicat里保存着连接配置。不幸的是,Navicat默认会对密码进行加密存储,直接查看连接属性只能看到一串星号。这种情况在团队协作、接手老项目或更换设备时尤为常见。
Navicat作为主流的数据库管理工具,从安全角度考虑,确实应该对敏感信息进行加密。但作为实际使用者,我们有时确实需要还原这些密码。经过多次实践验证,我总结出一套可靠的方法,可以解密Navicat保存的数据库密码。这个方法适用于Navicat 11及更早版本(使用Blowfish算法)和Navicat 12及更新版本(使用AES算法)。
重要提示:本文方法仅适用于解密自己合法拥有的数据库密码,严禁用于非法用途。解密他人数据库密码可能涉及法律风险。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作与环境配置
2.1 导出Navicat连接配置
首先需要从Navicat导出连接配置,这是获取加密密码的关键一步:
- 打开Navicat,在左侧连接列表中选择需要导出密码的连接
- 右键点击连接,选择"导出连接"
- 在弹出的对话框中,必须勾选"导出密码"选项(这是关键步骤)
- 选择保存位置,文件格式为.ncx(Navicat连接配置文件)
导出的.ncx文件是一个XML格式的文本文件,可以用任何文本编辑器打开。我推荐使用VS Code或Notepad++这类支持语法高亮的编辑器,方便查找关键信息。
2.2 定位加密密码
用文本编辑器打开导出的.ncx文件后,搜索"Password"字段。你会看到类似这样的内容:
xml复制<Connection Password="E5A36D8F4C2B3765A8D3E6F9C1B2A4D7" />
这串大写字母和数字的组合就是Navicat加密后的密码。不同版本的Navicat加密方式不同:
- Navicat 11及更早版本:使用Blowfish算法加密,密码长度为16的倍数
- Navicat 12及更新版本:使用AES算法加密,密码长度为32字符
3. 解密原理与代码实现
3.1 加密算法分析
Navicat使用的加密算法版本差异:
-
Navicat 11及更早版本:
- 加密算法:Blowfish/ECB/NoPadding
- 密钥:对字符串"3DC5CA39"进行SHA-1哈希后取前8字节
- 初始向量(IV):固定值"d9c7c3c8870d64bd"
-
Navicat 12及更新版本:
- 加密算法:AES/CBC/NoPadding
- 密钥:固定值"libcckeylibcckey"(16字节)
- 初始向量(IV):固定值"libcciv libcciv "(16字节)
3.2 Java解密代码详解
以下是完整的Java解密代码,我已添加详细注释说明每个关键部分:
java复制import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays
