Node.js 使用pbkdf2进行盐和散列

Node.js 使用pbkdf2进行盐和散列,node.js,passwords,pbkdf2,password-storage,Node.js,Passwords,Pbkdf2,Password Storage,我使用以下方法从nodejs中的crypto lib创建salt和hash密码: crypto.randomBytes(size, [callback]) crypto.pbkdf2(password, salt, iterations, keylen, callback) 对于随机字节调用(创建SALT),我应该使用什么大小?我听过128位的盐,可能高达256位。看起来这个函数使用的是字节大小,所以我可以假设32(256位)的大小就足够了吗 对于pbkdf2调用,什么是好的迭代次数,什么是键

我使用以下方法从nodejs中的crypto lib创建salt和hash密码:

crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
对于随机字节调用(创建SALT),我应该使用什么大小?我听过128位的盐,可能高达256位。看起来这个函数使用的是字节大小,所以我可以假设32(256位)的大小就足够了吗

对于pbkdf2调用,什么是好的迭代次数,什么是键(keylen)的好长度

另外,在存储方面,我看到了在同一列中存储salt、length、iterations和derviedkey的示例。我正在使用一个示例,该示例通过
分隔4,即:

salt::derivedKey::keyLength::iterations

这样做,我就可以在
::
上分离以获得4个值,这样我就可以根据提供的密码生成一个派生密钥,以查看它是否匹配。这是储存这个的正确方法吗?或者,在组合这些值时,我是否应该更具“欺骗性”。随机字节大小:

SALT的大小应至少与哈希函数相同,因此对于
sha256
,应至少使用32个字节。Node.js Crypto的
pbkdf2
使用
SHA1
,因此至少应该有20个字节。但是,您至少应该使用64位(8字节),如#3中所述。(来源:)

2。PBKDF2迭代次数

请参阅以进行精彩的讨论。我从中得出,10.000范围在不影响性能的情况下是足够的,但这取决于硬件/性能

3。PBKDF2长度

请参阅有关键长度的信息。在您的示例SHA-1中,参数也是使用的哈希函数,因此20字节是正确的值。由于建议至少使用64位的密钥,因此生成小于输入的密钥是一种浪费,因此至少使用8字节。不要使用大于20的输出长度,因为它不提供额外的安全性,但每乘以20,计算时间就会加倍

4。如何存储变量

在上面的所有链接中讨论过(尤其是),salt应该与密码一起保存(但决不能在其他地方重复使用),通常是先将其附加到结果字符串(salt:hash)或另一个数据库列中


就其他变量而言,它们的知识对于破坏安全性并不重要(如中所述,因此您可以在任何地方安全地对其进行参数化。您通过使用“:”分隔它们的方法可以做到这一点,但您正在保存额外的信息。仅保存
“算法:迭代:salt:hash”
,因此在您的情况下,
“salt::derivedKey::iterations”
就是您所需要的。

Fernando基本上是正确的,但请注意#3的来源错误。建议的salt长度是64位,而不是字节


使用64字节作为派生密钥是可以接受的,但仅使用salt就太过分了。

你指出我的错误是对的。我关于#3的结论将变为32字节salt。其原因来自第一篇来源文章:“一个好的经验法则是使用与哈希函数输出大小相同的salt。“因此,如果他使用SHA-256,他的salt应该与输出相同(32字节),这高于建议的最小64位。”由于PBKDF2的标准建议至少64位的salt,因此生成小于输入的密钥是一种浪费,因此至少使用64字节。“salt输入只需8字节长(64位),这里有拼写错误吗?@StrangeWill是的,请看Michael的评论。但我正在编辑我的答案以反映这一点。事实上,由于我的答案很旧,而且已经被接受,我不想做太多修改。但是粗体字在#1和#3处的大小将更改为建议的20字节-PBKDF2建议64位,所以是8字节,但盐应该在le处ast具有相同大小的散列函数,因此对于Node.js Crypt中的SHA1,这将是20个字节,而SHA256将是32个字节。