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

Cryptography 使用HMAC SHA-1的PBKDF2如何返回超过20个字节?,cryptography,sha1,hmac,pbkdf2,Cryptography,Sha1,Hmac,Pbkdf2,如果节点的crypto.PBKDF2使用HMAC SHA-1,密钥长度怎么可能超过20字节 以下是我的理解(显然是错误的):crypto.PBKDF2(密码、salt、迭代、keylen、回调)使用HMAC SHA-1将密码与salt散列。然后,它把散列和它用同样的盐进行散列。无论你告诉它多少次迭代,它都会重复,然后将结果传给你。结果将被截断为您在keylen中指定的字节数 ,或20字节。但是,我可以从crypto.PBKDF2请求超过20个字节的keylen,超过20个字节后,数据不会重复。这

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

以下是我的理解(显然是错误的):
crypto.PBKDF2(密码、salt、迭代、keylen、回调)
使用HMAC SHA-1将密码与salt散列。然后,它把散列和它用同样的盐进行散列。无论你告诉它多少次迭代,它都会重复,然后将结果传给你。结果将被截断为您在
keylen
中指定的字节数

,或20字节。但是,我可以从
crypto.PBKDF2
请求超过20个字节的
keylen
,超过20个字节后,数据不会重复。这对我来说没有意义

我在这里误解了什么?

试一试:

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

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

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


我建议不要使用PBKDF2来派生超出自然输出大小/底层散列大小的内容。通常这只会减慢防守队员的速度,而不会减慢进攻队员的速度


我宁愿运行一次
PBKDF2
来派生一个主密钥,然后使用HKDF从中派生多个秘密。请参阅

有趣的帖子,目前正在为Bouncy实施HKDF:)注意,我完全同意您关于使用PBKDF2进行更大输出大小的评估。我个人认为这是考虑创建PBKDF3或类似的东西来为PBE构造创建更长的OKM(输出键控材质)的充分理由。KDF在加密领域很少受到关注。就我个人而言,我已经将KDF2与PBKDF2相结合,但由于HKDF更安全,所以我当然更倾向于采用这种方式。David同时接受了我的实现:)@owlstead相关邮件列表:我认为NIST可能应该更多地关注KDF,他们似乎已经对KDF或更高级的签名方案有了相当多的了解