How can PBKDF2 using HMAC SHA-1 return more than 20 bytes?
如果Node的crypto.PBKDF2使用HMAC SHA-1,密钥长度如何超过20个字节?
这是我的理解(显然是错误的):crypto.PBKDF2(password, salt, iterations, keylen, callback)使用HMAC SHA-1对带有salt的密码进行哈希处理。然后,它采用该哈希值并用相同的salt对其进行哈希处理。它会重复进行多次迭代,您告诉它,然后将结果传回给您。结果被截断为您在keylen中指定的字节数。
SHA-1输出160位或20字节。但是,我可以从crypto.PBKDF2请求超过20个字节的keylen,并且超过20个字节后,数据就不会重复。这对我来说没有意义。
我在这里误会什么?
尝试一下:
1 2 3 4 5
| c.pbkdf2('password', 'salt', 1, 21, function(err, key) {
for (var i = 0; i < key.length; i++) {
console.log(key[i].toString(36));
}
}); |
我希望在第20个字节之后看到某种模式,但我没有。
要导出第i个块,PBKDF2运行全键派生,将i连接到salt。因此,要获得您的第21个字节,它只需使用不同的有效salt值再次运行推导,就可以得到完全不同的输出。这意味着派生21个字节的开销是派生20个字节的开销的两倍。
我建议不要使用PBKDF2来获得比自然输出大小/基础哈希大小更大的值。通常,这只会减慢防御者而不是攻击者的速度。
我宁愿运行PBKDF2一次以派生单个主密钥,然后使用HKDF从中派生多个秘密。当同时生成AES密钥和HMAC密钥以加密然后生成MAC时,请参阅如何给PBKDF2加salt?在crypto.SE
- 有趣的帖子,目前正在实施HKDF for Bouncy :)
-
请注意,我完全同意您关于使用PBKDF2进行较大输出尺寸的评估。我个人认为这足以考虑创建PBKDF3或类似的方法来为PBE构造创建更长的OKM(输出键材料)。在加密世界中,KDF很少受到关注。就我个人而言,我已经将KDF2与PBKDF2耦合了,但是由于HKDF更安全,因此肯定是首选。大卫在此期间接受了我的实施:)
-
@owlstead相关邮件列表:crypt-dev
-
我以为NIST可能应该更多地关注KDF,它们似乎已经对KDF有了相当多的了解,或者更高级的签名方案