我一直在研究如何在数据库中安全地存储密码。通常建议您使用盐。正如Secure hash and salt for PHP passwords中的一个答案所解释的那样,这会改变哈希的价值,使密码更难以妥协。
作为验证机制的一部分,用户输入的密码与盐组合并根据需要进行散列。鉴于盐对使用者是透明的,使用盐如何提供任何额外的好处?
正如我所看到的,无论是否有散列,相同的密码都会成功验证您,因为使其不同的管道将在幕后进行。这就是为什么到目前为止我读过的文章都没有澄清过。
答案 0 :(得分:4)
考虑一个场景,您接受来自您的用户的密码,并通过网络发送或以纯文本形式存储在数据库中。
如果您的用户输入的密码长度为6-8个字符。黑客可能会为所有可能的6-8个字符长度的字符串预先生成哈希值,并且可以通过将其与哈希值进行比较来推断密码。(将哈希值与所有预生成哈希值匹配,他可以得到一组可能的候选人,如果发生碰撞)
但是,如果你在他的纯文本密码中添加30个字符的盐,然后哈希它。任何黑客都很难预先生成该范围的所有可能组合。这就是我们使用盐的主要原因。
出于安全考虑,您无法限制每个用户输入30个字符长的密码。如果任何用户选择4个字符长度的密码,只需添加30个char盐并使其更安全。
答案 1 :(得分:3)
Salted密码降低了rainbow table已包含盐渍密码哈希的可能性。