首页 文章

使用pbkdf2进行SALT和HASH

提问于
浏览
22

我使用以下方法从nodejs中的crypto lib创建salted和散列密码:

crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)

对于randomBytes调用(创建SALT),我应该使用什么尺寸?我听过128位盐,可能高达256位 . 看起来这个函数使用的是字节大小,所以我可以假设32(256位)的大小就足够了吗?

对于pbkdf2调用,什么是大量的迭代以及密钥(keylen)的长度是多少?

此外,对于存储,我已经看到了在同一列中存储salt,length,iterations和derviedkey的示例 . 我正在使用一个将4分隔为 :: 的例子,即:

salt::derivedKey::keyLength::iterations

这样做,然后我可以在 :: 上分离以获得4个值,因此我可以根据提供的密码生成派生密钥以查看它是否匹配 . 这是存储它的正确方法吗?或者我应该更多地结合这些 Value 观?

2 回答

  • 26

    1. Random bytes size

    盐应该至少与哈希函数的大小相同,因此对于 sha256 ,您应该使用至少32个字节 . Node.js Crypto的 pbkdf2 使用 SHA1 ,所以20个字节应该是最小的 . 但是,至少应该使用 64 bits (8 bytes) ,如#3中所述 . (来源:https://crackstation.net/hashing-security.htm) .

    2. PBKDF2 number of iterations

    请参阅this question进行精彩讨论 . 我从中得出 10.000 range 足以没有影响性能,但这取决于硬件/性能 .

    3. PBKDF2 length

    有关密钥长度,请参阅this other discussion . 该参数再次是使用的散列函数,在您的情况下为SHA-1,因此20个字节是正确的值 . 由于PBKDF2's Standard建议盐至少为 64 bits ,因此生成小于输入的密钥是浪费,因此至少使用 8 bytes . 不要使用大于20的输出长度,因为它不提供额外的安全性,但是每20的倍数计算时间加倍 .

    4. How to store variables

    在上面的所有链接(特别是the first)中讨论过,salt应该沿着密码保存(但从不在别处重复使用),通常是先在结果字符串(salt:hash)或其他数据库列中附加它 .

    至于其他变量,他们的知识对于破坏安全性并不重要(如_2675120中所述,因此您可以在任何地方安全地进行参数化 . 通过将它们与_2675121分开来实现它的方式很好,但是您节省了额外的信息 . 仅仅是Crackstation's codes保存 "algorithm:iterations:salt:hash" ,所以在你的情况下, "salt::derivedKey::iterations" 就是你所需要的 .

  • 3

    费尔南多大多是正确的,但要注意#3是错误的 . 建议的salt长度为64 bits ,而不是字节 .

    对于派生密钥使用64个字节是可以接受的,但对于单独的盐来说是过度的 .

相关问题