“数据库已加密”是Navicat检测到SQLCipher加密标识后的正常提示,表明该SQLite文件经AES-256文件级加密,需在“高级”选项卡中输入正确明文密钥解密;原生sqlite3.dll不支持加密,须替换为e_sqlcipher.dll并重启Navicat。
Navicat 连接 SQLite 提示“数据库已加密”是什么意思
这不是错误,而是 navicat 检测到数据库文件被 sqlcipher 加密后的正常反馈。sqlite 原生不支持密码,所谓“加密”本质是用 sqlcipher 扩展对整个 .db 文件做了 aes-256 文件级加密。navicat 读取文件头时发现 magic bytes 匹配 sqlcipher 格式(如以 sqlcipher 开头的 16 字节标识),就会弹出该提示并要求输入密码。
为什么直接连接失败?必须替换 sqlite3.dll
Navicat 自带的 sqlite3.dll 是标准 SQLite3 编译版,不含 SQLCipher 支持。遇到加密库时会拒绝加载,报错类似 file is encrypted or is not a database 或直接卡在“测试连接”失败。
- 必须用
e_sqlcipher.dll(来自SQLitePCLRaw.bundle_e_sqlcipher或官方 SQLCipher 构建)替换 Navicat 安装目录下的sqlite3.dll - Windows 下路径通常是:
C:\Program Files\PremiumSoft\Navicat Premium\sqlite3.dll(注意区分 x86/x64 版本) - macOS/Linux 用户需替换对应架构的动态库,且确保有执行权限
- 替换后务必重启 Navicat,否则缓存仍会加载旧库
“高级”选项卡里填的 password 不是登录凭据,而是解密密钥
在 Navicat 的 SQLite 连接设置 → “高级” → 勾选“已加密”后填入的 password,不是传统意义上的数据库用户密码,而是 SQLCipher 的密钥(key)。它参与 AES 密钥派生,必须与创建/加密该库时使用的完全一致(包括大小写、空格、编码方式)。
- 若原始库是用十六进制密钥(如
key=x'2DD285F2A1...')创建的,Navicat 不支持直接输 hex;此时需用明文密码重建库,或改用命令行工具转换 - Navicat 内部使用的是 PBKDF2-HMAC-SHA1,默认迭代次数 64000,与标准 SQLCipher 兼容,但不兼容自定义 KDF 参数的库
- 如果填错密钥,错误表现通常是:连接测试通过(Navicat 不校验密钥有效性),但打开表时报
database disk image is malformed或查不到数据
Java/.NET/Qt 等外部程序连同一个加密库,密钥格式必须统一
Navicat 用明文密码解密,不代表其他生态也这么处理。不同语言驱动对密钥的解释方式差异很大,容易踩坑:
- Java 的
sqlite-jdbc-crypt要求密钥传key=myhexkey(十六进制字符串),不能直接用 Navicat 里填的明文 - .NET 的
Microsoft.Data.Sqlite+SQLitePCLRaw.bundle_e_sqlcipher支持明文Password="xxx",但必须确保 bundle 加载的是 e_sqlcipher 而非 sqlite3 - Qt 的
SQLITECIPHER驱动默认走明文,但加密算法若设为aes128cbc,和 Navicat 默认的sqlcipher(即 aes256cbc)不互通
最稳妥的做法:所有端都用同一套 SQLCipher CLI 工具创建/重加密库,并记录清楚所用 cipher、kdf_iter、fast_kdf、hmac_salt_mask 等参数。Navicat 只负责可视化,别把它当加密配置中心。


















