多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

为什么Navicat 12弃用Blowfish改用AES128?NCX文件加密机制深度剖析(how-does-navicat-encrypt-password)

为什么Navicat 12弃用Blowfish改用AES128?NCX文件加密机制深度剖析(how-does-navicat-encrypt-password) 为什么Navicat 12弃用Blowfish改用AES128NCX文件加密机制深度剖析how-does-navicat-encrypt-password【免费下载链接】how-does-navicat-encrypt-passwordTransferred from https://github.com/DoubleLabyrinth/how-does-navicat-encrypt-password项目地址: https://gitcode.com/gh_mirrors/ho/how-does-navicat-encrypt-passwordNavicat 密码加密机制一直是数据库管理员和开发者关注的焦点。本项目 how-does-navicat-encrypt-password 通过逆向分析揭示了 Navicat 如何加密并存储数据库密码Navicat 11 及更早版本使用Blowfish算法加密密码并写入 Windows 注册表而 Navicat 12 在导出 NCX 连接文件时改用AES128CBC 模式 PKCS7 填充。本文将带你快速看懂这套密码加密机制的完整流水线、两代算法的差异原因以及如何用项目工具解密 NCX 文件中的密码 一、勾选保存密码后Navicat 做了什么当你使用 Navicat 新建数据库连接、填写主机/端口/密码并勾选Save Password后点击 OKNavicat 并不会把明文密码直接写到磁盘——它会先对密码进行加密再把加密结果一串十六进制字符串存入Windows 注册表。以 MySQL 为例注册表路径为HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\连接名不同数据库类型对应不同的注册表分支如 NavicatMSSQL、NavicatOra、NavicatPG、NavicatSQLite 等。下面的截图来自项目文档注册表中Pwd项的值E817D1F3…就是加密后的密码 注意这层加密属于防窥视级别而非强安全边界——因为加密密钥硬编码在程序中任何拿到注册表权限的人都可以还原密码。二、Navicat 11 的 Blowfish 加密流水线如何工作Navicat 11 及更早版本对密码的处理分为三步完整 C/C 实现见 cpp/NavicatCrypto.hpp、cpp/blowfish.c、cpp/sha1.c1. 用 SHA-1 生成固定密钥Navicat 对固定字符串3DC5CA39计算 SHA-1 摘要得到 160 位结果直接作为 Blowfish 的加密密钥。2. 构造初始向量IVBlowfish 每次只能加密 8 字节。Navicat 先把一个 8 字节全为0xFF的块用 Blowfish 加密一次得到的密文D9C7C3C8870D64BD就是固定初始向量。3. 流水线逐块加密密码密码按 8 字节分块逐块执行异或 → Blowfish 加密 → 异或更新向量的流水线下图展示了整个加密过程最后一块不足 8 字节时执行图中最右侧的特殊步骤最后所有密文块被拼成一串十六进制字符串写入注册表这就是你在Pwd项里看到的内容。三、为什么Navicat 12弃用Blowfish改用AES128Navicat 12 开始当你导出NCX 连接文件Navicat Connection eXport file用于备份或迁移连接配置时密码加密算法换成了AES128/CBC/PKCS7Padding实现见 java/NavicatCrypto/Navicat12Cipher.java 与 python3/ncx-dump.py参数值算法AES128 / CBC / PKCS7Padding密钥libcckeylibcckey16 字节硬编码初始向量libcciv libcciv16 字节硬编码原因一Blowfish 的时代局限算法年代久远Blowfish 设计于 1993 年而 AES 是 2001 年 NIST 选定的现代标准且在 AES-NI 硬件指令集支持下快得多分组过小Blowfish 每次只能处理 8 字节分组长数据下理论攻击面更大AES 的 16 字节分组更稳健自实现 CBC 易出错v1 的异或链是手工实现的流水线任何一处偏差都会引发兼容性问题换成标准库实现更省心。原因二NCX 文件是可移植的备份文件NCX 文件会被用户导出、备份、迁移到别的机器。选用一套标准、通用、跨平台库都能直接实现的算法AES-CBC-PKCS7比维护一套自研 Blowfish 流水线更工程化跨语言实现也更简单项目就分别用 C、C#、Java、VB.NET 各自独立实现了它。原因三换算法不等于换安全模型值得警惕的是AES128 方案的密钥与 IV 同样是硬编码的固定值。这意味着 Navicat 12 的 NCX 加密本质上仍是混淆——算法参数公开任何了解参数的人都能还原密码项目的 ncx-dump.py 正是这样做的。真正的安全改进要到后续版本才出现 四、更进一步新版本引入 AES-256-GCM在更新的 Navicat 版本中对应工具脚本的 v3 算法密码加密升级为AES-256-GCM密钥不再硬编码而是从Windows 凭据管理器中的navicat_cred条目派生采用 GCM 模式自带完整性校验认证标签且每次加密使用随机 nonce。这是从硬编码密钥到系统级凭据的实质性提升解密不仅需要知道算法还需要当前 Windows 账户的权限。五、快速上手如何解密 NCX 文件中的加密密码项目提供了多语言实现Python / C / C# / Java / VB.NET最快的是 Python 工具一键安装步骤git clone https://gitcode.com/gh_mirrors/ho/how-does-navicat-encrypt-password pip install cryptography pywin32pywin32仅在需要自动从 Windows 凭据管理器读取 navicat_credv3 算法时必需。10 秒解析一个 NCX 文件python3 python3/ncx-dump.py /path/to/connections.ncx工具会自动依次尝试 v1Blowfish与 v2AES128两种算法输出每个连接的明文密码[MYSQL:dummy] host localhost port 3306 username root password dummy123456其他常用工具python3/navicat-cipher.py对单个密码执行 v1/v2/v3 的加密enc或解密decpython3/show-navicat.py在 Windows 上列出注册表中所有 Navicat 连接配置及还原后的明文密码。六、写在最后这套机制教会我们的三件事加密 ≠ 保密密钥硬编码时参数公开即形同虚设它只是防窥视算法会过时从 Blowfish 到 AES128 再到 AES-256-GCM正是密码学演进的缩影——选型时要看算法的生命周期NCX 文件要管好既然 NCX 中的密码可被轻易还原这份备份就应视同明文妥善保管。 项目关键文件速览路径说明doc/how-does-navicat-encrypt-password.md加密机制完整说明文档cpp/NavicatCrypto.hpp、cpp/blowfish.c、cpp/aes.cC/C 加密实现csharp/NavicatCrypto.cs、vb.net/NavicatEncrypt.vb.NET 实现java/NavicatCrypto/Navicat11Cipher.java、Navicat12Cipher.javaJava 实现v1/v2python3/ncx-dump.py、python3/navicat-cipher.py、python3/show-navicat.pyNCX 解析、加解密与注册表查看工具【免费下载链接】how-does-navicat-encrypt-passwordTransferred from https://github.com/DoubleLabyrinth/how-does-navicat-encrypt-password项目地址: https://gitcode.com/gh_mirrors/ho/how-does-navicat-encrypt-password创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表