Navicat提示“文件已加密”是真实检测到SQLCipher格式,需替换sqlite3.dll(Windows)或libsqlite3.dylib(macOS)为e_sqlcipher版本,连接时在“高级”勾选“已加密”并填明文密码(Navicat自动转hex),Java端须用sqlite-jdbc-crypt驱动、URL含dbmode=navicat_sqlcipher及十六进制key、驱动类为io.github.willena.sqlite.DBConnection。
navicat 提示“文件已加密”不是误报,而是它检测到了 sqlcipher 格式的数据库头(magic bytes),但当前连接配置没提供解密密钥或驱动不支持——你必须显式启用解密流程,否则它会拒绝加载。
Navicat 连接加密 SQLite 时必须替换 sqlite3.dll
Navicat 自带的 sqlite3.dll(Windows)或 libsqlite3.dylib(macOS)默认不支持 SQLCipher。即使你在“高级”选项卡勾选了“已加密”,它仍会报错或静默失败。
- 从 NuGet 安装
SQLitePCLRaw.bundle_e_sqlcipher,找到对应平台的e_sqlcipher.dll(如win-x64/e_sqlcipher.dll) - 进入 Navicat 安装目录(例如
C:\Program Files\PremiumSoft\Navicat Premium 17),备份原sqlite3.dll - 把
e_sqlcipher.dll复制过去,并重命名为sqlite3.dll - 重启 Navicat,否则新 DLL 不生效
连接配置中 key 参数必须是十六进制字符串
Navicat 的“密码”字段不接受明文口令,只认 SQLCipher 要求的 hex key(如 2dd2c95b0e8f...)。如果你在 Navicat 中用的是明文密码(比如填了 123456),那这个数据库其实是用 hex(123456) 即 313233343536 当作密钥加密的。
- 打开 Navicat 加密数据库时,“密码”框里必须填原始明文(Navicat 会自动转 hex)
- 但用命令行或 Java 连接时,
key=后必须是 hex 字符串,不能是明文 - 验证方法:用
sqlite3 your.db命令行尝试PRAGMA key = '313233343536'; SELECT count(*) FROM sqlite_master;,能查到表说明密钥对
Java 程序连 Navicat 加密库要换驱动和 URL 参数
标准 sqlite-jdbc 驱动完全无法识别 Navicat 加密格式,强行连接只会抛 java.sql.SQLException: file is encrypted or is not a database。
- 必须改用
sqlite-jdbc-crypt,Maven 依赖写法:<groupId>io.github.willena</groupId><artifactId>sqlite-jdbc-crypt</artifactId><version>3.39.2</version> - URL 必须带
dbmode=navicat_sqlcipher,不是cipher=sqlcipher:jdbc:sqlite:/path/to/db.db?dbmode=navicat_sqlcipher&key=313233343536 - 驱动类名不是
org.sqlite.JDBC,而是io.github.willena.sqlite.DBConnection - 连接时用户名密码传空字符串即可:
DriverManager.getConnection(url, "", "")
最容易被忽略的是 DLL 替换后没重启 Navicat,以及 Java 侧用了旧驱动还硬套 MySQL/PostgreSQL 的 SSL 或 cipher 参数逻辑——SQLite 加密是文件级的,没有握手、证书、TLS 这些概念,所有“加密配置”最终都归结为一个 hex 字符串能否正确喂给 SQLCipher 的 PRAGMA key。


















