为什么对散列密码进行加盐可以提高安全性?

3
我一直在研究如何安全地将密码存储在数据库中。通常建议使用盐来加密密码。正如Secure hash and salt for PHP passwords中的一个答案所解释的那样,这会改变哈希值的值,使密码更难以被破解。
作为验证机制的一部分,用户输入的密码将与盐结合并根据需要进行哈希。考虑到用户无法看到盐,那么使用盐有什么额外的好处呢?
我认为,无论是否进行哈希,相同的密码都将成功验证您的身份,因为使其不同的内部处理将在幕后进行。这就是为什么我读过的所有文章都没有澄清这些问题的原因。

1
你应该阅读例如http://en.wikipedia.org/wiki/Salt_(cryptography)。 - Oliver Charlesworth
1
请注意,盐的目的是阻止恶意用户访问哈希本身。 - Oliver Charlesworth
可能是什么是加盐密码哈希的优势?的重复问题。 - littleadv
2个回答

5
考虑这样一种情况,您从用户那里接受一个密码,并将其作为明文通过网络发送或存储在数据库中。
如果您的用户输入一个6-8个字符长的密码,则黑客可能已经为所有可能的6-8个字符长度的字符串预生成了哈希值,并且可以通过将其与您的哈希值进行比较来推断出密码(如果发生冲突,则将您的哈希值与所有预生成的哈希值进行匹配,他可以得到一组可能的候选项)。
但是,如果您将30个字符的盐附加到他的明文密码中,然后对其进行哈希处理,任何黑客都很难预先生成该范围内的所有可能组合。这就是我们使用盐的主要原因。
出于安全考虑,您不能限制每个用户输入30个字符长的密码。如果任何用户选择4个字符长的密码,只需添加30个字符的盐即可使其更安全。

1
这基本上是正确的,但是将一个30个字符的盐添加到一个4个字符的密码中并不能真正起到太大的帮助。盐的作用是使任何密码计算都是唯一的,因此攻击者无法使用预先计算好的表来获取哈希值。然而,盐并没有加密。在SQL转储中,盐是明文的。因此,破解一个四个字符的密码仍然非常简单。因为只有四个字符需要猜测。它增加的安全性微不足道。 - Erlend
@Eriend - 是的,对于一个4个字符的密码,加盐确实增加了很少的安全性。但是对于更长的密码来说,它确实有用。安全性不在于破解单个密码。这仍然需要暴力破解时间。安全性在于如果我在50个不同的网站上使用相同的密码,这些网站都使用不同的盐,即使您成功破解了一个网站并找出了我的明文密码和相应的哈希值,您也无法将该哈希值与其他网站存储的哈希值进行比较-您需要再次破解/暴力破解它们。 - iheanyi
没有盐值,一旦找到已知哈希的明文,您可以轻松地妥协任何密码恰好具有相同哈希的人,而无需进一步努力。盐值更多地是为了保护其他人免受一个笨蛋的错误影响。当然,如果在妥协初始站点后,您假设我使用了相同的密码-那么您就会成功了。但是,如果没有直接的方法将不同站点上的各种帐户直接关联到我,则攻击者仍然需要大量工作。 - iheanyi

4

盐值密码可以减少彩虹表已经包含盐值密码哈希的概率。


1
假设使用适当的盐(大且随机),以及不易受暴力破解的哈希算法(SHA-1过于快速)。但是,是的,盐的主要目的确实不是为了“保密”(至少不比它所加的哈希值更保密 :) - user166390
1
彩虹表是基于典型的基于字典的密码,还是通过哈希本身计算得出的? - Gigi
彩虹表基本上是使用相同的哈希函数预先生成的哈希值。例如,对于长度为4的字符串,将生成所有4个字符长度的组合,并通过相同的哈希函数进行处理和存储。如果在未来您获得任何4个字符长度的哈希值,则只需在表中查找可能的候选项即可。 - Rajesh Pantula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接