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