【问题标题】:sqlcipher: failed to access DB providing hex keysqlcipher:无法访问提供十六进制密钥的数据库
【发布时间】:2011-03-25 08:37:14
【问题描述】:

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

echo -n 演示 |沙萨姆-a256 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

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

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

但这不起作用。

我应该提供给 PRAGMA 指令的 key 的十六进制值是多少?

【问题讨论】:

    标签: iphone sqlite encryption sqlcipher


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那么嗯...当密钥包含不可打印的字符时,如何从 PRAGMA 界面设置密钥?如果我在引号之间强制使用奇怪的二进制值字符,它似乎不起作用,即使我确保将单引号加倍。
    • 另外,如果我尝试相反的方式,调用 sqlite3_key 然后发出 PRAGMA kbd_iter=0 它似乎没有同样的效果说使用 PRAGMA key = "x'...'"
    • 如果您使用二进制数据作为密钥材料,您可以: 1) 如果数据是随机的,使用十六进制密钥语法,提供全套密钥材料。它不会通过密钥推导运行 2)如果数据是二进制但不是随机的,则对其进行编码,即 Base 64 或十六进制等,然后将其作为字符串传递,此时它将通过密钥推导运行。
    • 我不清楚如何将原始密钥传递给 sqlite3_key 接口,因为所有迹象似乎都表明它等同于非原始 PRAGMA
    • @Michael 哦,你只是将文字字符串“x''”传递给 sqlite3_key 吗?我假设某种方式可以传递一个 32 字节的原始二进制缓冲区,我猜...
    猜你喜欢
    • 2017-05-07
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多