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

时间:2013-01-18 08:13:05

标签: cryptography sha1 hmac pbkdf2

如果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个字节之后看到某种模式,但我没有。

1 个答案:

答案 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