【问题标题】:How to get raw key data from passphrase and PBKDF2 iterations如何从密码和 PBKDF2 迭代中获取原始密钥数据
【发布时间】:2017-03-09 23:42:43
【问题描述】:

SQLCipher 中,可以通过两种方式提供数据库密钥:作为密码(与相关的 PBKDF2 轮数)或作为原始密钥。

在给定密码(任意字符串)和轮数的情况下,我试图找到一种方法来获取原始密钥(以 64 个字符的十六进制字符串形式给出)。我认为解决方案在于自己以某种方式执行 PBKDF2 密钥派生,但我不太熟悉这可能如何工作,或者它是否会产生一个值,我可以将其作为原始密钥提供给 PRAGMA KEY。另外,PBKDF2函数似乎带了盐,我不知道。如果必须的话,我相信我可以深入研究 sqlcipher 源代码来解决这个问题,但我希望可能已经有一种我缺少的简单方法来做到这一点。

【问题讨论】:

    标签: sqlcipher


    【解决方案1】:

    关于 SQLCipher 密钥派生的详细信息可以在on the design page 找到。 salt 存储在数据库文件的前 16 个字节中。然后,您将使用盐和密码短语以及适当数量的 PBKDF2-HMAC-SHA1 轮(SQLCipher 3 为 64,000,早期版本为 4,000)

    【讨论】:

    • 读完这篇文章后,我认为如果你使用原始密钥,文件的 16 个字节中没有随机盐,我是否正确,所以你不能只做类似预先计算散列密钥并将其视为原始密钥,因为它们的解密方式不完全相同?
    • 使用原始密钥时,SQLCipher 不执行密钥派生。文件开头仍有随机数据,但未使用。你能解释一下你想要完成什么吗?
    • 从用户指定的密码短语迁移到某种形式的受保护的原始密钥,但在此期间(在迁移现有数据库之前)需要一个可以同时工作的解决方案。可能只是检测给定的密码短语是否真的是原始密钥并相应地指定 pragma。
    • 这可能是最简单的方法。您当然可以在 SQLCipher 之外重现相同的密钥派生功能,但是这将是完全多余的,并且取决于您使用的 API,它也可能会慢得多。如果您使用的是 SQLCipher 2 或 3,您还需要生成 HMAC 密钥,以使所有内容都能内聚地工作。在我看来,仅使用内置密钥派生会容易得多,然后,当您切换到保管库密钥方法时,重新为数据库设置密钥。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多