22

我一直在阅读加盐和散列密码的好处,但有一件事仍然让我难以捉摸......

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

所以如果我这样做..

HashPW = PW.RANDOMNUMBER

我可以将随机数存储在数据库中,但这似乎扼杀了添加盐的全部意义..不是吗?我也可以为每个盐使用一个非随机数,但这也会扼杀盐的意义,因为如果他们发现他们拥有我所有的用户密码......

我刚开始学习 PHP 和 MySQL,像这样的抽象东西让我很困惑

谢谢!

4

5 回答 5

20

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

于 2009-09-12T20:29:23.593 回答
15

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

关键是,由于每个用户的盐是不同的,因此您不能使用预构建的哈希字典将哈希密码映射到明文(彩虹攻击)。

于 2009-09-12T20:28:54.620 回答
2

salt 可防止某人获取您的加密密码数据库的副本并同时对所有密码进行离线攻击。它不能防止针对单个密码的攻击。

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

于 2009-09-13T07:12:31.857 回答
1

创建哈希密码时,您应该使用“双”盐

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

然后,在进行身份验证时,您从 --$pass--$salt-- 字符串重新创建散列,并将其与存储在 db 中的通行证进行比较。

于 2009-09-12T20:31:29.193 回答
0

您不需要为每个密码使用单独的盐。

加盐的目的是为了抵制彩虹表——你将一个候选密码转换成一个新的字符串,其中包含你的盐;因为盐是只有你拥有的一些私有字符串,所以知道盐渍密码的哈希不会帮助拥有磨坊彩虹表的攻击者。

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

但是,这是不必要的。您已经为每个用户拥有了一个唯一的字符串——用户名。这不是秘密,所以不是好盐;然而,用户名和全局秘密盐的连接既是秘密又是唯一的。如果存储(username+salt+password)的hash,在查找时只需要知道单个全局salt值。

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

于 2009-09-12T20:44:40.073 回答