5

如果 Nodecrypto.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));
    }
});

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

4

1 回答 1

6

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


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

我宁愿运行PBKDF2一次以派生单个主密钥,然后使用 HKDF 从中派生多个秘密。请参阅如何在生成 AES 密钥和 HMAC 密钥以加密然后 MAC 时对 PBKDF2 进行加盐?在crypto.SE上

于 2013-01-18T08:22:29.357 回答