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

Mik*_*Lin 5 cryptography sha1 hmac pbkdf2

如果Node crypto.PBKDF2使用HMAC SHA-1,那么密钥长度如何超过20个字节?

这是我理解的(显然不正确):crypto.PBKDF2(password, salt, iterations, keylen, callback)使用HMAC SHA-1用盐哈希密码.然后,它需要的是哈希和哈希具有相同的盐.它会重复这一点,无论你告诉它多少次迭代,然后将结果传回给你.结果将截断为您指定的字节数keylen.

SHA-1输出160位或20个字节.但是,我可以要求keylen超过20个字节crypto.PBKDF2,并且在第20个字节之后,数据不会重复.这对我来说没有意义.

我在这里误解了什么?

试试看:

c.pbkdf2('password', 'salt', 1, 21, function(err, key) {
    for (var i = 0; i < key.length; i++) {
        console.log(key[i].toString(36));
    }
});
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*aos 6

为了得到i第一个块,PBKDF2运行完整的密钥推导,并i连接到盐.因此,为了获得第21个字节,它只是再次运行推导,使用不同的有效盐,从而产生完全不同的输出.这意味着导出21个字节的速度是导出20个字节的两倍.


我建议不要使用PBKDF2来获得超过底层哈希的自然输出大小/大小.通常这只会减慢防守者,而不是攻击者.

我宁愿运行PBKDF2一次派生一个主密钥,然后使用HKDF从中获取多个秘密.有关加密,然后生成MAC的AES密钥和HMAC密钥,请参见如何加密PBKDF2?在crypto.SE