我正在使用KeyDerivation.Pbkdf2生成密码哈希,我想知道一般建议是关于盐长度与Pbkdf2输出的总体哈希长度相比。盐长与总哈希长度比
在下面的实现中,我使用HMACSHA512,并且假设salt是512位,并且hashBitLength也是512位。
KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA512, iterationCount, hashBitLength/8);
我见过它使用HMACSHA256一个例子,但它的盐设置为128位和整体哈希位长度为256 为什么会采取这种方式?
我读过512位可能是矫枉过正,但在存储方面,它并不关心我(我不知道性能如何受到影响,但我没有测试过)。
盐的长度应与整个生成的散列值相同。 它应该是一半? 或者它应该超过某个阈值并低于整体长度?
我的直觉告诉我做这件事的方式是正确的(除了可能是512位),因为我怀疑我得到的是最大熵,但我不是密码学家。
有人可以请澄清这一点吗?
感谢您的论文链接,这里有很多需要阅读的内容。 还有一些我仍然需要的答案: 1)salt的长度应该和hash一样长吗?即如果我使用HMAC512,盐应该是512位? 我看到一些消息来源说,盐和哈希算法是无关的,而另一些人说他们应该是相同的长度。 2)更长时间的盐不会造成更多的计算成本更高的攻击?或者它只是唯一性而不是盐的长度(例如,256位盐与4096盐一样安全?) – Steviebob
@Steviebob:1)不,盐长与散列之间没有关系。事实上,昨天刚刚发现NIST现在说盐只有32位 - 参见[5.1.1.2节的底部](https://pages.nist.gov/800-63-3/sp800-63b的.html#sec5)。那些声称它需要与哈希长度相同的人不知道他们在说什么,作为他们缺乏理由证明索赔的证据。 2)盐不会使计算成本更高。它用于唯一性,防止重复输出和彩虹攻击。 – TheGreatContini