随机盐密码哈希

更新:我最近从这个问题中得知,在下面的整个讨论中,我(以及其他人也确实)有点困惑:我一直称之为彩虹表,实际上称为哈希表。 彩虹表是更复杂的生物,实际上是Hellman Hash Chains的变种。 虽然我相信答案仍然是一样的(因为它不归结为密码分析),但一些讨论可能有点偏差。
问题是:“什么是彩虹桌,它们是如何使用的?”


通常,我总是建议使用密码强的随机值作为盐,以便与散列函数(例如用于密码)一起使用,以防止彩虹表攻击。

但是,盐是随机的,它实际上是密码学上必需的吗? 在这方面,任何独特的价值(每个用户都是唯一的,例如userId)就足够了吗? 它实际上会阻止使用单个彩虹表来破解系统中的所有(或大部分)密码......
但熵的缺乏是否真的削弱了散列函数的密码强度?


请注意,我不是在问为什么要使用salt,如何保护它(不需要),使用单个常量散列(不),或者使用什么样的散列函数。
只是盐是否需要熵。


感谢所有答案到目前为止,但我想专注于我(一点)不太熟悉的领域。 密码分析的主要含义 - 如果有人从加密数学PoV中获得一些输入,我会非常感激。
另外,如果还有其他向量没有考虑到,那也是很好的输入(请参阅@Dave Sherohman指向多个系统)。
除此之外,如果您有任何理论,想法或最佳实践 - 请通过证明,攻击情景或经验证据来支持这一点。 或者甚至可以考虑可接受的权衡......我对这个主题的最佳实践(大写B资本P)很熟悉,我想证明这实际上提供了什么样的价值。


编辑:这里有一些非常好的答案,但我认为@Dave说,它归结为彩虹表的常见用户名称......也可能不太常见的名称。 但是,如果我的用户名是全球唯一的呢? 对于我的系统不一定是唯一的,但每个用户 - 例如电子邮件地址。
没有动机为单个用户构建RT(如@Dave所强调的,盐不会保密),这仍然会阻止集群。 唯一的问题是,我可能在不同的网站上有相同的电子邮件和密码 - 但盐无论如何不会阻止。
所以,它回归到密码分析 - 熵是必要的,还是不是? (我目前的想法是从密码分析的角度来看这不是必须的,但是这是出于其他实际原因。)


传统上,Salt被存储为哈希密码的前缀。 这已经让任何有权访问密码哈希的攻击者知道。 将用户名用作盐或不影响这些知识,因此它对单系统安全性没有影响。

但是,将用户名或任何其他用户控制的值用作salt将会降低跨系统安全性,因为在使用相同密码散列算法的多个系统上拥有相同用户名和密码的用户最终会得到相同的密码散列每个系统。 我不认为这是一个重大的责任,因为作为攻击者,我会尝试使用已知目标帐户在其他系统上使用的密码,然后尝试任何其他方式破坏帐户。 相同的散列只会提前告诉我已知的密码会起作用,它们不会使实际的攻击变得更容易。 (但请注意,对帐户数据库进行快速比较将提供一个高优先级目标列表,因为它会告诉我哪些人是谁以及谁不重复使用密码。)

这个想法面临的更大危险是,用户名通常会被重复使用 - 例如,您关心的任何网站都会有一个名为“Dave”的用户帐户,而“admin”或“root”更为常见 - 这将会使针对这些通用名称的用户构建彩虹表变得更容易和更有效。

这两个缺陷都可以通过在对密码进行哈希处理之前向密码添加第二个盐值(固定和隐藏或像标准盐一样暴露)来有效解决,但是在那个时候,您可能无论如何只是使用标准熵盐将用户名加入其中。

编辑添加:很多人都在谈论熵和盐中的熵是否重要。 这是,但不是因为它的大多数评论似乎认为。

普遍的想法似乎是熵是重要的,以便攻击者难以猜测盐。 这是不正确的,实际上完全不相关。 正如人们多次指出的那样,受盐影响的攻击只能由拥有密码数据库的人员进行,而拥有密码数据库的人只需查看每个账户的盐即可。 当你可以轻易地查看它时,无论是否可以猜测都无关紧要。

熵的重要性在于避免盐值的聚集。 如果salt基于用户名,并且您知道大多数系统将有一个名为“root”或“admin”的帐户,那么您可以为这两种盐制作彩虹表,并且它会破解大多数系统。 另一方面,如果使用随机16位盐并且随机值大致均匀分布,那么对于所有2 ^ 16种可能的盐,您需要一个彩虹表。

这并不是要阻止攻击者知道个人账户的盐是什么,而是关于不给他们一个单一盐的大而肥胖的目标,这个目标将用于大部分潜在目标。


使用高熵盐对于安全地存储密码是绝对必要的。

以我的用户名'gs'并将其添加到我的密码'MyPassword'给出gsMyPassword。 如果用户名没有足够的熵值,这很容易被彩虹表破坏,这可能是该值已经存储在彩虹表中,尤其是如果用户名短。

另一个问题是您知道用户参与两项或更多项服务的攻击。 有很多常见的用户名,可能最重要的是admin和root。 如果有人创建了一个含有最普通用户名的盐的彩虹桌,他可以使用它来危害帐户。

他们曾经有一个12位盐。 12位是4096个不同的组合。 这还不够安全,因为现在很多信息可以轻松存储。 这同样适用于4096个最常用的用户名。 很可能您的一些用户会选择属于最常用用户名的用户名。

我找到了这个密码检查器,它可以计算出密码的熵。 在密码中使用较小的熵(比如使用用户名)会使彩虹表变得更容易,因为它们试图至少覆盖所有低熵密码,因为它们更可能发生。


诚然,仅用户名可能会有问题,因为人们可能会在不同的网站中共享用户名。 但是,如果用户在每个网站上有不同的名字,这应该是没有问题的。 那么为什么不在每个网站上使它独一无二。 像这样散列密码

散列函数( “www.yourpage.com /” +用户名+ “/” +密码)

这应该可以解决问题。 我不是密码分析的主人,但我确信我们不使用高熵的事实会使哈希值变弱。

链接地址: http://www.djcxy.com/p/21547.html

上一篇: random salt for password hashes

下一篇: What is the optimal length for user password salt?