Encryption Can';升级SQLCipher后无法访问加密的数据库

Encryption Can';升级SQLCipher后无法访问加密的数据库,encryption,sqlcipher,Encryption,Sqlcipher,我最近从SQLCipher 3.7.12升级到了3.8.5。这样做之后,我刚刚发现我的加密数据库都不可读——它们都返回错误26,表明密码是错误的,但我使用的密码与它们加密时使用的密码相同。如果我使用与3.7.12链接的旧二进制文件访问同一数据库,我可以很好地访问数据库 我在文档中没有看到任何东西表明这两个版本之间不兼容,或者提到访问旧版本创建的数据库所需的任何更改。可能其中一个pragma默认值已更改(即kdf_iter),或者可能实际上存在不兼容?我需要做什么才能使现有数据库与新版本的SQLC

我最近从SQLCipher 3.7.12升级到了3.8.5。这样做之后,我刚刚发现我的加密数据库都不可读——它们都返回错误26,表明密码是错误的,但我使用的密码与它们加密时使用的密码相同。如果我使用与3.7.12链接的旧二进制文件访问同一数据库,我可以很好地访问数据库


我在文档中没有看到任何东西表明这两个版本之间不兼容,或者提到访问旧版本创建的数据库所需的任何更改。可能其中一个pragma默认值已更改(即kdf_iter),或者可能实际上存在不兼容?我需要做什么才能使现有数据库与新版本的SQLCipher一起工作?

在深入挖掘源代码后,我发现我最初的怀疑是完全正确的:

$ diff src/crypto.h ~/Downloads/sqlcipher-master/src/crypto.h
47c47
< #define CIPHER_VERSION "2.2.1"
---
> #define CIPHER_VERSION "3.1.0"
62c62
< #define PBKDF2_ITER 4000
---
> #define PBKDF2_ITER 64000

在尝试访问数据库之前

更新:如果执行
附加
。。。文件上说

实际上,这意味着调用应用程序在打开任何可能使用不同salt的现有数据库时,应提供ATTACH参数上的键。


这似乎与不同版本的行为不同,在不同版本中,仅具有相同的密钥(不是salt)就足以不需要指定附加的密钥。

正如您所注意到的,在2.x和3.x版本之间,密钥派生长度确实从4000更改为64000。您可以发出
PRAGMA cipher\u migrate
将2.x数据库迁移到3.x格式。可以找到有关此功能的更多文档

PRAGMA kdf_iter = '4000';
PRAGMA cipher_default_kdf_iter = 4000;