如果我为每个用户随机创建SALT,我该如何对它们进行身份验证?

时间:2009-09-12 20:28:03

标签: database hash passwords password-protection

我一直在阅读关于盐渍和散列密码的好处,但有一件事我仍然没有...

当我为每个用户提供随机盐时,当我尝试对他们进行身份验证登录时,如何知道盐是什么?

所以,如果我这样做..

HASHPW = PW.RANDOMNUMBER

我可以将随机数存储在数据库中,但这似乎会杀死添加盐的全部内容..不是吗?我也可以为每个盐使用一个非随机数,但是那也会杀死盐点,因为如果他们弄清楚了他们的所有用户密码......

我刚刚开始学习PHP和MySQL,这样的抽象事情让我很困惑

谢谢!

5 个答案:

答案 0 :(得分:19)

它没有破坏独特盐的储存目的。独特的盐的目的是保护您的整个用户存储库免受攻击,而不是给定的个人用户。如果攻击者危害您的数据库并且确定足以破解特定用户的帐户,他们就会。我们无能为力。但是他们必须花费大量的计算机时间才能这样做 - 足以使用每个用户花费那么多时间 - 从而保护所有用户。相比之下,对所有用户使用相同的盐 - 一旦攻击者拥有盐,就可以在相对较短的时间内针对每个用户重新运行相同的表/进程。

答案 1 :(得分:15)

为每个用户随机生成Salt,但它保存在数据库的某个位置。您查找特定用户的salt并使用它来验证用户。

关键是,由于每个用户的盐不同,因此您无法使用预先构建的哈希字典将散列密码映射为明文(rainbow attack)。

答案 2 :(得分:2)

盐会阻止某人获取加密密码数据库的副本,并同时对所有密码进行脱机攻击。它不会阻止对单个密码的攻击。

您可能会喜欢阅读原始的Unix密码安全文章。它可以很好地解释盐是什么,为什么我们有盐:http://portal.acm.org/citation.cfm?id=359172

答案 3 :(得分:1)

创建散列密码时,应使用“double”salt

创建一个salt(随机md5或sha1),然后使用类似sha1(“ - $ password - $ salt--”)的格式,然后在数据库中存储散列密码和salt。

然后,在进行身份验证时,从 - $ pass - $ salt--字符串重新创建哈希值,并将其与存储在db中的传递进行比较。

答案 4 :(得分:1)

每个密码都不需要单独的盐。

腌制的目的是抵制彩虹表 - 你将候选密码转换成一个新的字符串,里面有你的盐;因为盐只是你拥有的一些私人字符串,因为知道盐渍密码的哈希不会帮助那些拥有磨机彩虹表的攻击者。

聪明的攻击者可以尝试通过创建帐户并更改密码以观察生成的哈希值来为您的服务构建自定义彩虹表。如果每个用户的盐相同,那么当他看到散列“xyz123”对应于“apple”,并注意到另一个用户的散列也是“xyz123”时,他可以断定该用户的密码是“apple”。这是大多数人决定为每个用户存储唯一盐的地方。

但是, 这是不必要的 。您已为每个用户提供了唯一的字符串 - 用户名。这不是秘密,所以它不是好盐;然而,用户名和全局秘密盐的串联既是秘密的,也是唯一的。如果存储(username + salt + password)的哈希值,则只需要在查找时知道单个全局salt值。

(如果有人泄漏了单一的全球盐,这会带来更大的风险。但这是一项值得考虑的技术。)