使用pbkdf2的SALT和HASH
我正在使用以下方法从nodejs中的encryption库中创build一个腌制和散列的密码:
crypto.randomBytes(size, [callback]) crypto.pbkdf2(password, salt, iterations, keylen, callback)
对于randomBytes调用(创buildSALT)我应该使用什么大小? 我听说过128位盐,也许高达256位。 它看起来像这个函数使用字节的大小,所以我可以假设大小为32(256位)就足够了?
对于pbkdf2调用,什么是很好的迭代次数,key(keylen)的长度是多less?
此外,对于存储,我已经看到了盐,长度,迭代和derviedkey存储在同一列的例子。 我正在使用一个例子来分隔4 ::
,即:
salt::derivedKey::keyLength::iterations
这样做,我可以分开::
以获得4个值,所以我可以根据提供的密码生成派生的密钥,看看它是否匹配。 这是存储这个的正确方法吗? 还是应该在结合这些价值观时多一些“欺骗”?
1.随机字节大小 :
盐的大小应至less与散列函数大小相同,因此sha256
应至less使用32个字节。 Node.js Crypto的pbkdf2
使用SHA1
,因此20个字节应该是最小的。 但是,至less应该使用64位(8字节) ,如#3所述。 (来源: https : //crackstation.net/hashing-security.htm )
2. PBKDF2迭代次数 :
看到这个问题的一个很好的讨论。 我从中得知,在没有冲击性能的情况下, 10,000范围是足够的,但是这是硬件/性能相关的。
3. PBKDF2长度 :
请参阅关于密钥长度的其他讨论 。 这个参数又是哈希函数,在你的情况下SHA-1,所以20个字节是正确的值。 由于PBKDF2的标准推荐使用至less64位的盐,所以生成小于您的input的键是一种浪费,因此至less使用8个字节 。 不要使用大于20的输出长度,因为它不提供额外的安全性,但每20倍的计算时间加倍。
4.如何存储variables :
在上面的所有链接(特别是第一个 )中讨论,盐应该沿着密码保存(但从来没有在其他地方重复使用),通常通过在结果string(salt:hash)或其他数据库列中添加盐。
就其他variables而言,他们的知识对于违背安全性来说并不重要(正如Kerckhoffs的原则所述 ,所以你可以在任何地方安全地进行参数化。你用“::”分隔它们的方法是好的, 但是你可以节省额外的信息 。Crackstation的代码只保存"algorithm:iterations:salt:hash"
,所以在你的情况下, "salt::derivedKey::iterations"
是你所需要的。
费尔南多大部分都是正确的,但要小心#3是错误的。 推荐的salt长度是64 位 ,而不是字节。
对于派生的密钥使用64个字节是可以接受的,但对于单独的盐来说是过分的。