如果Node的crypto.PBKDF2
使用HMAC SHA-1,那么密钥长度怎么能超过20个字节呢?
这是我理解的(显然不正确):crypto.PBKDF2(password, salt, iterations, keylen, callback)
使用HMAC SHA-1来哈希密码。然后它使用相同的哈希值哈希和哈希它。它会重复这一点,无论你告诉它多少次迭代,然后将结果传回给你。结果将截断为您在keylen
中指定的字节数。
SHA-1 outputs 160 bits,或20个字节。但是,我可以从keylen
请求crypto.PBKDF2
超过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个字节之后看到某种模式,但我没有。
答案 0 :(得分:6)
要派生i
块,PBKDF2运行完整密钥派生,i
连接到salt。因此,为了获得第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