使用 HMAC SHA-1 的 PBKDF2 如何返回超过 20 个字节?

Posted

技术标签:

【中文标题】使用 HMAC SHA-1 的 PBKDF2 如何返回超过 20 个字节?【英文标题】:How can PBKDF2 using HMAC SHA-1 return more than 20 bytes? 【发布时间】: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 个字节之后看到某种模式,但我没有。

【问题讨论】:

【参考方案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,他们似乎已经对它们有相当多的了解,或者更高级的签名方案

以上是关于使用 HMAC SHA-1 的 PBKDF2 如何返回超过 20 个字节?的主要内容,如果未能解决你的问题,请参考以下文章

PBKDF2-HMAC-SHA1

PBKDF2-HMAC-SHA2 测试向量

如何使用 PKCS5_PBKDF2_HMAC_SHA1()

PBKDF2-HMAC-SHA-512 测试向量

PBKDF2-HMAC-SHA256 for JAVA 的可靠实现

HMAC-SHA1:如何在 Java 中正确执行?