los*_*ion 25 passwords password-storage pbkdf2 node.js
我使用以下方法从nodejs中的crypto lib创建salted和散列密码:
crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
Run Code Online (Sandbox Code Playgroud)
对于randomBytes调用(创建SALT),我应该使用什么尺寸?我听过128位盐,可能高达256位.看起来这个函数使用的是字节大小,所以我可以假设32(256位)的大小就足够了吗?
对于pbkdf2调用,什么是大量的迭代以及密钥(keylen)的长度是多少?
此外,对于存储,我已经看到了在同一列中存储salt,length,iterations和derviedkey的示例.我正在使用一个分隔4 by的例子::
,即:
salt::derivedKey::keyLength::iterations
Run Code Online (Sandbox Code Playgroud)
这样做,然后我可以分开::
获取4个值,因此我可以根据提供的密码生成派生密钥,以查看它是否匹配.这是存储它的正确方法吗?或者我应该在结合这些价值观时更具"欺骗性"?
Fer*_*lli 28
1.随机字节大小:
盐应至少与哈希函数的大小相同,因此sha256
至少应使用32个字节.Node.js pbkdf2
使用Crypto SHA1
,所以20个字节应该是最小的.但是,您应该使用的最少是64位(8字节),如#3中所述.(来源:https://crackstation.net/hashing-security.htm).
2. PBKDF2迭代次数:
请参阅此问题以进行深入讨论.我从中得出10.000范围就足够了,没有影响性能,但这取决于硬件/性能.
3. PBKDF2长度:
请参阅关于密钥长度的其他讨论.该参数再次是使用的散列函数,在您的情况下为SHA-1,因此20个字节是正确的值.由于PBKDF2的标准建议使用至少64位的盐,因此生成小于输入的密钥是浪费,因此至少要使用8个字节.不要使用大于20的输出长度,因为它不提供额外的安全性,但是每20的倍数计算时间加倍.
4.如何存储变量:
在上面的所有链接(特别是第一个)中讨论过,salt应该沿着密码保存(但从不在别处重复使用),通常是先将它附加在结果字符串(salt:hash)中,或者放在另一个数据库列中.
至于其他变量,他们的知识对于破坏安全性并不重要(如Kerckhoffs原则中所述,所以你可以在任何地方安全地进行参数化.你用"::"分隔它们的方式很好,但你节省了额外的信息.Crackstation的代码只能保存"algorithm:iterations:salt:hash"
,所以你的情况,"salt::derivedKey::iterations"
是你所需要的.
归档时间: |
|
查看次数: |
12219 次 |
最近记录: |