使用 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】:为了派生i
th 块,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 个字节?的主要内容,如果未能解决你的问题,请参考以下文章