使用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个字节是可以接受的,但对于单独的盐来说是过分的。