我使用以下方法从 NodeJS 中的加密库创建加盐和哈希密码:
crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
对于 randomBytes 调用(创建 SALT),我应该使用什么大小?我听说过 128 位盐,也许高达 256 位。看起来这个函数使用的大小以字节为单位,所以我可以假设 32 (256 位)的大小就足够了吗?
对于 pbkdf2 调用,最佳迭代次数是多少以及密钥 (keylen) 的最佳长度是多少?
另外,对于存储,我看到了将盐、长度、迭代和 derviedkey 存储在同一列中的示例。我正在使用一个将 4 分隔开的示例::
, i.e.:
salt::derivedKey::keyLength::iterations
这样做,我就可以分开了::
获取 4 个值,因此我可以根据提供的密码生成派生密钥以查看其是否匹配。这是存储这个的正确方法吗?或者我应该在结合这些价值观时更加“欺骗”一点?
1. 随机字节大小:
盐的大小应至少与哈希函数的大小相同,因此对于sha256
您应该至少使用 32 个字节。 Node.js 加密货币pbkdf2
uses SHA1
,所以 20 个字节应该是最小值。但是,您至少应该使用的是64 位(8 字节),如#3 中所述。 (来源:https://crackstation.net/hashing-security.htm https://crackstation.net/hashing-security.htm).
2.PBKDF2迭代次数:
See 这个问题 https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pkbdf2-sha256进行精彩的讨论。我从中得到了10.000 范围在不影响性能的情况下就足够了,但这取决于硬件/性能。
3.PBKDF2长度:
See 其他讨论 https://security.stackexchange.com/questions/31564/key-length-and-hash-function-in-pbkdf2关于密钥长度。该参数再次是使用的哈希函数,在您的情况下是 SHA-1,因此 20 字节是正确的值。自从PBKDF2的标准 http://en.wikipedia.org/wiki/PBKDF2建议盐至少64 bits,生成小于输入的密钥是一种浪费,因此至少使用8 bytes。不要使用大于 20 的输出长度,因为它不提供额外的安全性,但每次 20 的倍数都会使计算时间加倍。
4. 如何存储变量:
上面所有链接中都讨论过(特别是首先 https://crackstation.net/hashing-security.htm),盐应该与密码一起保存(但永远不要在其他地方重复使用),通常是将其首先附加到结果字符串(salt:hash)或另一个数据库列中。
就其他变量而言,他们的知识对于破坏安全性并不重要(如柯克霍夫斯原理 https://en.wikipedia.org/wiki/Kerckhoffs%27s_principle,这样您就可以在任何地方安全地对其进行参数化。你用“::”分隔它们的方法很好,但你正在保存额外的信息. Crackstation 的代码 https://crackstation.net/hashing-security.htm只保存"algorithm:iterations:salt:hash"
,所以在你的情况下,"salt::derivedKey::iterations"
是你所需要的全部。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)