【问题标题】:How can PBKDF2 using HMAC SHA-1 return more than 20 bytes?使用 HMAC SHA-1 的 PBKDF2 如何返回超过 20 个字节?
【发布时间】:2013-01-01 22:05:03
【问题描述】:

如果 Node 的 crypto.PBKDF2 使用 HMAC SHA-1,那么密钥长度怎么可能超过 20 个字节?

这是我的理解(显然是错误的):crypto.PBKDF2(password, salt, iterations, keylen, callback) 使用 HMAC SHA-1 用盐对密码进行哈希处理。然后它使用该哈希值并用相同的盐对 it 进行哈希处理。无论您告诉它多少次迭代,它都会重复,然后将结果传回给您。结果将被截断为您在keylen 中指定的字节数。

SHA-1 outputs 160 bits,或 20 个字节。但是,我可以从crypto.PBKDF2 要求keylen 超过20 个字节,并且超过第20 个字节,数据不会重复。这对我来说没有意义。

我在这里有什么误解?

试试看:

c.pbkdf2('password', 'salt', 1, 21, function(err, key) {
    for (var i = 0; i < key.length; i++) {
        console.log(key[i].toString(36));
    }
});

我希望在第 20 个字节之后看到某种模式,但我没有。

【问题讨论】:

    标签: cryptography sha1 hmac pbkdf2


    【解决方案1】:

    为了派生ith 块,PBKDF2 运行完整的密钥派生,将i 连接到盐。因此,要获得您的第 21 个字节,它只需使用不同的有效盐再次运行推导,从而产生完全不同的输出。这意味着导出 21 个字节的成本是导出 20 个字节的两倍。


    我建议不要使用 PBKDF2 来导出超过底层哈希的自然输出大小/大小。通常这只会减慢防御者的速度,而不是攻击者的速度。

    我宁愿运行一次PBKDF2 以派生单个主密钥,然后使用 HKDF 从中派生多个秘密。见How to salt PBKDF2, when generating both an AES key and a HMAC key for Encrypt then MAC? on crypto.SE

    【讨论】:

    • 有趣的帖子,目前正在为 Bouncy 实现 HKDF :)
    • 请注意,我完全同意您对使用 PBKDF2 关于更大输出尺寸的评估。就我个人而言,我认为这足以考虑创建 PBKDF3 或类似的东西来为 PBE 构造创建更长的 OKM(输出密钥材料)。 KDF 在加密世界中很少受到关注。就我个人而言,我已经将 KDF2 与 PBKDF2 结合起来,但由于 HKDF 更安全,因此肯定是首选。与此同时,David 接受了我的实现 :)
    • @owlstead 相关邮件列表:crypt-dev
    • 我在想 NIST 可能应该更多地关注 KDF,他们似乎已经对它们有相当多的了解,或者更高级的签名方案
    猜你喜欢
    • 2014-07-19
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-02-26
    相关资源
    最近更新 更多