2

我正在尝试使用 sqlcipher 创建数据库,然后使用密码密钥的十六进制值访问它。根据 github (https://github.com/sjlombardo/sqlcipher) 的描述,密钥由 sha256 算法散列,然后用于加密 DB。可以选择通过 PRAGMA 指令以普通和十六进制形式提供密钥。如果我使用普通版本,它一切正常,但我无法使用十六进制键值访问数据库。例如,在我的情况下,键是“演示”,当我使用PRAGMA key='demo'所有作品时。我得到了 sha256:

回声-n 演示 | shasum -a256 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

然后根据 sqlite3_exec 调用中的说明将其提供给 PRAGMA 指令:

sqlite3_exec(db, "PRAGMA key = x'2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea'", NULL, NULL, NULL);

但这不起作用。

我应该向 PRAGMA 指令提供密钥的十六进制值是多少?

4

1 回答 1

3

传递文本值与原始十六进制值时 pragma key 的结果不可互换。

  • 如果您通过 PRAGMA key='demo' 提供文本密钥,SQLCipher 使用 PBKDF2 导出密钥数据(请参阅http://sqlcipher.net/design)。默认情况下,这使用随机的每个数据库盐和 4000 次迭代。
  • 如果您提供十六进制密钥,则 SQLCipher 直接使用二进制值作为密钥,无需派生。

因此,您提到的两种模式之间的实际加密密钥将完全不同。如果您不确定要使用哪个,您可能应该默认使用第一种方法,因为密钥派生步骤提供了更高级别的保护,防止暴力破解和字典攻击。

我将尝试在未来更新自述文件以使其更加清晰。

于 2011-03-25T13:49:48.343 回答