升级SQLCipher后无法访问加密数据库

时间:2014-06-10 14:41:10

标签: encryption sqlcipher

我最近从SQLCipher 3.7.12升级到3.8.5。执行此操作后,我刚刚发现我的所有加密数据库都不可读 - 它们都返回错误26,表示密码错误,但我使用的密码与加密时相同。如果我使用链接到3.7.12的旧二进制文件访问同一个数据库,我可以正常访问数据库。

我没有在文档中看到任何暗示这两个版本之间不兼容的内容,或者提到访问旧版本创建的数据库所需的任何更改。也许其中一个pragma默认值已经改变(即kdf_iter),或者实际上可能存在不兼容性?为了使我的现有数据库能够使用新版本的SQLCipher,我需要做些什么?

2 个答案:

答案 0 :(得分:2)

在对源代码进行一些挖掘之后,我发现我最初的怀疑是绝对正确的:

$ 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

因此,要使数据库与现有数据库兼容,只需将src / crypto.h第62行的#define更改回4000,或明确使用:

PRAGMA kdf_iter = '4000';

PRAGMA cipher_default_kdf_iter = 4000;

尝试访问数据库之前。

更新:如果执行ATTACH ......文档说

,这似乎不够

In practice, this means that calling applications should provide the key on the ATTACH parameter when opening any existing databases that may use a different salt.

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

答案 1 :(得分:0)

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