【发布时间】:2010-10-06 21:36:26
【问题描述】:
更新:我最近从this question 了解到,在下面的整个讨论中,我(我相信其他人也是如此)有点令人困惑:我一直称之为彩虹表的东西实际上被称为哈希表。彩虹表是更复杂的生物,实际上是 Hellman Hash Chains 的一种变体。虽然我相信答案仍然是一样的(因为它不归结为密码分析),但有些讨论可能有点歪曲。
问题:“What are rainbow tables and how are they used?”
通常,我总是建议使用加密强度高的随机值作为盐,与散列函数(例如密码)一起使用,以防止彩虹表攻击。
但是,salt 的随机性实际上在密码学上是必要的吗?在这方面是否有任何唯一值(每个用户唯一,例如 userId)就足够了?实际上,它会阻止使用单个 Rainbow Table 来破解系统中的所有(或大部分)密码...
但是缺乏熵真的会削弱散列函数的加密强度吗?
注意,我不是在问为什么要使用盐,如何保护它(它不需要),使用单个常量哈希(不要),或者使用什么样的哈希函数。 只是盐是否需要熵。
到目前为止,感谢大家的回答,但我想专注于我(有点)不太熟悉的领域。主要是对密码分析的影响 - 如果有人对密码数学 PoV 有一些意见,我将不胜感激。
此外,如果还有其他未考虑的向量,这也是很好的输入(请参阅@Dave Sherohman 关于多个系统的观点)。
除此之外,如果您有任何理论、想法或最佳实践 - 请用证据、攻击场景或经验证据支持这一点。甚至是对可接受的权衡的有效考虑...我熟悉该主题的最佳实践(资本 B 资本 P),我想证明这实际上提供了什么价值。
编辑:这里有一些非常好的答案,但我认为正如@Dave 所说,它归结为常见用户名的彩虹表......以及可能不太常见的名称。但是,如果我的用户名是全球唯一的怎么办?对于我的系统来说不一定是唯一的,但对于每个用户来说都是独一无二的——例如电子邮件地址。
没有动力为单个用户构建 RT(正如@Dave 强调的那样,盐不是保密的),这仍然会阻止集群。唯一的问题是我可能在不同的站点上拥有相同的电子邮件和密码 - 但无论如何 salt 不会阻止这种情况。
所以,它回到密码分析——熵是否必要? (我目前的想法是从密码分析的角度来看没有必要,但出于其他实际原因。)
【问题讨论】:
-
我必须说我对下面的许多答案感到困惑。使用盐的主要目的只是为了防止彩虹表攻击,因此用户应该做任何独特的事情,因为它迫使攻击者为每个盐重新创建一个彩虹表。我的 2c。
-
如果需要盐,例如。网站,您通常在 url 中有 id。如果攻击者知道(我们假设他知道)密码 salt 是用户 ID+用户名,那么修改攻击以避免 salt 值是相当容易的。
-
@dmajkic,salt 旨在防止 RT 攻击并区分不同用户的相同密码。这是给定的,即使有用户名。
-
@AviD:确实如此。但是,如果我知道我的 pass 的哈希值,并且我知道 salt 是我的用户名,那么我可以轻松地为任何字典单词创建 hashed pass 值,并将其与其他人 pass hash 进行比较。这就是为什么时间比用户名更好。
-
刚刚在 PHP 安全联盟网站上发现一篇文章,在其示例中使用 md5 散列 随机 数字作为盐 phpsec.org/articles/2005/password-hashing.html
标签: security authentication hash cryptography password-protection