更新: 我最近从这个问题中了解到,在下面的讨论中,我(我确定其他人也是)有点混淆:我一直称为彩虹表的东西实际上被称为哈希表。 彩虹表是更复杂的生物,实际上是Hellman Hash Chains的变体。 虽然我认为答案仍然相同(因为它并不涉及密码分析),但一些讨论可能有些偏差。
问题是:“什么是彩虹表,它们如何使用?”
通常,我总是建议使用具有加密强度的随机值作为盐,与哈希函数一起使用(例如用于密码),以防范彩虹表攻击。
但实际上,盐是否必须是随机的呢?在这方面,任何唯一值(每个用户唯一,例如userId)都可以吗?实际上,这将防止使用单个彩虹表破解系统中的所有(或大多数)密码...
但缺乏熵是否真的会削弱哈希函数的加密强度?
请注意,我不是在问为什么要使用盐,如何保护它(不需要),使用单个常量哈希(不要),或者要使用哪种哈希函数。
只是询问盐是否需要具备熵。
感谢所有的回答,但我想集中讨论我(有点)不熟悉的领域。主要是对密码分析的影响 - 如果任何人从密码数学的角度提供一些信息,我将不胜感激。
此外,如果还有其他未被考虑的向量,那就是很好的输入(请参见@Dave Sherohman关于多个系统的观点)。
除此之外,如果您有任何理论、想法或最佳实践,请用证据、攻击场景或经验证明支持这一点。或者甚至考虑可接受的权衡的有效考虑... 我熟悉有关此问题的最佳实践(大写B大写P),我想证明这实际上提供了什么价值。
编辑:这里有一些非常好的回答,但我认为正如@Dave所说,它归结为对常见用户名的彩虹表攻击...以及可能是不太常见的用户名。但是,如果我的用户名在全球范围内都是唯一的呢?不一定是针对我的系统而言是唯一的,而是针对每个用户都是唯一的——例如电子邮件地址。
对于一个单独的用户没有建立彩虹表的动机(正如@Dave强调的那样,盐值并不是保密的),这仍然可以防止聚类。唯一的问题是我可能在另一个网站上使用相同的电子邮件和密码——但无论如何盐值也无法防止这种情况。
因此,问题又回到了密码学分析——是否需要熵?(我目前的想法是从密码学分析的角度来看它不是必需的,但出于其他实际原因则是必需的。)