关于加密:使用HMAC SHA-1的PBKDF2如何返回20个以上的字节?

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