自定义参数配置的SQLCipher数据库在C++及命令行无法打开问题咨询
问题原因
- 核心错误是加密参数的配置顺序不符合SQLCipher的执行要求:所有加密相关的PRAGMA参数必须在输入数据库密钥之后、执行任何数据库读写操作之前完成设置,你之前先配置参数再打开数据库、或者打开数据库后先做其他操作再配置参数的逻辑都会触发默认加密参数校验,自然无法识别自定义参数加密的数据库文件。
- 次要可能性:不同平台的SQLCipher大版本差异可能导致加密逻辑不兼容,建议确认Windows端DBBrowser使用的SQLCipher版本和Ubuntu/树莓派上的安装版本保持一致(优先统一为4.x系列稳定版)。
命令行正确操作步骤
- 终端执行命令启动sqlcipher并指定目标数据库文件:
sqlcipher /path/to/your_encrypted_database.db - 第一步先输入数据库密钥,注意密码含特殊字符时做好转义:
PRAGMA key = '你设置的数据库密码'; - 紧接着依次执行你自定义的加密配置参数:
PRAGMA cipher_page_size = 1024; PRAGMA kdf_iter = 16000; PRAGMA cipher_hmac_algorithm = HMAC_SHA512; PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;
- 执行测试语句验证连接正常:
SELECT count(*) FROM sqlite_master;
如果正常返回结果说明数据库已成功解密,可执行后续查询操作。
C++开发适配方案
不管你使用原生SQLite3接口还是第三方封装库,都遵循如下执行流程即可:
- 调用数据库打开接口(如原生
sqlite3_open)完成数据库文件打开操作 - 先执行密钥设置语句
PRAGMA key = '你的密码',确认语句执行成功 - 依次执行上述4条自定义加密PRAGMA语句,每条都校验返回值避免配置失败
- 所有加密配置完成后,再执行业务层面的CRUD操作即可
注意:不要在配置完所有加密参数前执行任何读写操作(包括预查询表是否存在、读取sqlite_master系统表等行为),否则会触发默认参数解密逻辑,直接抛出
file is not a database错误。
内容的提问来源于stack exchange,提问作者Bna' Marco
相关产品推荐
相关产品推荐

