使用带有SQLCipher的FMDB解密数据库,带有错误密码的setkey始终返回YES

时间:2016-12-23 12:47:11

标签: sqlite fmdb sqlcipher

FMDB版本(2.6.2)

问题: 我正在测试FMDB和SQLCipher,并发现一个棘手的问题。 我成功地使用密码'test001'加密数据库,然后导出它并使用DB Brower打开数据库,使用'test001'我打开它没有任何问题。然后在Xcode中我尝试用密码'test002'打开数据库(我这样做是为了测试FMDB是否会告诉我我使用了错误的密码),但是setkey()返回YES。我检查db.lastErrorMessage,它返回nil,这意味着FMDB认为我给了正确的密钥。然后我尝试使用executeQuery()从数据库中读取数据,该函数返回NO,NSLog显示'文件已加密或不是数据库'。

任何人都有同样的问题?它是sqlite的错误还是以错误的方式使用它?

setkey() return YES

executeQuery() return NO due to decrypt error

1 个答案:

答案 0 :(得分:0)

setKey(…)的调用不会验证提供的密码是否对当前数据库有效,而只是使数据库在SQLCipher中导致attach a codec context。在键入数据库之后发出的下一个SQL命令将导致密钥派生(只要您不使用原始十六进制密钥),并且通常将验证SQLCipher是否能够使用密钥来访问您的数据库。我们通常建议您尝试执行以下查询以验证密码是否有效,因为sqlite_master表始终存在,无论您的架构如何。

SELECT count(*) FROM sqlite_master;