4

想知道每次更改密码时盐对于单个给定用户是否唯一是否重要,或者每次重用相同的盐是否不是什么大问题。

我目前每次给定用户更新密码时都会生成一个新的随机字符串作为盐。这样,每次用户有一个新密码时,他们也是一个盐变化。这很容易做到,为什么不呢。

嗯......这就是为什么。我需要存储以前的 X 密码以确保密码不会被重复使用。在过去(我最后一次为此编写代码时),我可以只存储以前的 MD5 哈希值,并将新的哈希值与该列表进行比较。好吧,既然我使用了每次盐都是唯一的加盐哈希,那么这些比较不再可能,因为不再知道以前的盐。

为了使该系统正常工作,我有两个选择:除了最终的哈希值之外,还存储盐的历史记录,或者在每次密码更新时为任何给定用户重复使用相同的盐。这些中的任何一个都可以让我建立可以与历史相提并论的价值观。

后者工作量少,但它是否失去任何力量?从实际的角度来看,我不认为它确实如此。以为我会在这里得到第二个意见。谢谢。

为了保持问题“可回答” - 为任何用户重复使用相同的盐是否会减少可接受的最小保护以保持可搜索的密码历史记录(以防止 pswd 回收)?

4

4 回答 4

6

重复使用相同的盐意味着如果用户明确成为黑客的目标,他们可以使用“用户的盐”生成“密码哈希”字典——这样即使用户更改了密码,黑客仍然会立即知道新密码,无需任何额外工作。

我每次都会用不同的盐。

至于存储 MD5 哈希加盐 - 大概您已经存储了盐 + 哈希,以验证用户的当前密码。为什么不能只保留完全相同的信息以进行历史检查?这样,您可以使用一段代码来进行密码检查,而不是分离当前路径和历史路径。他们在做同样的事情,所以他们使用相同的代码是有意义的。

编辑:为了解释我的意思,考虑一个 4 个字符的盐,附加到密码......为了争论,假设有人在他们的密码(和盐)中只使用 AZ、az 和 0-9。

如果您不提前知道盐(在准备字典攻击时),那么为了为所有 8 个字符的“人类”密码准备字典,您需要对 62^12 个连接密码进行哈希处理。但是,如果您总是知道连接密码的前 4 个字符是什么(因为您提前知道了 salt),那么您只需散列 62^8 个值 - 所有以 salt 开头的值即可。它使盐对特定的攻击毫无用处。

当然,这只适用于目标用户——而且只有当攻击者在密码更改之前和之后都可以访问哈希列表时。它基本上使更改密码作为安全措施的效果降低。

于 2009-09-23T06:32:54.790 回答
1

在密码哈希中使用盐的另一个原因是隐藏两个用户使用相同密码的事实(并不罕见)。使用不同的哈希值,攻击者将看不到这一点。

于 2009-09-23T06:39:15.103 回答
0

我可能在这里非常昏暗,但是,您将在哪里存储对于具有足够访问权限以获取散列密码的人来说无法访问的盐。

于 2009-09-23T07:19:23.533 回答
0

首先,停止使用 MD5(如果你正在使用它),使用 SHA-2、MD5、SHA-0 和 SHA-1,都是死哈希。

- 编辑:

我现在同意 Jon Skeet 的观点,并建议您考虑在每次更改密码时生成新的盐。它涵盖了一个小案例,攻击者可能会获得盐+哈希,然后无法再次获得访问权限,但仍然允许他(对你如何组合它们进行一些猜测)计算未来所有可能的哈希值密码。它非常小,而且不是那么重要,因为密码大小需要非常小(比如 8 个字符),即使离线计算它们也很实用。然而它存在。

其次,要考虑它是否重要,我们需要考虑盐的用途。这是为了防止对仅拥有完整密码列表的人进行离线攻击。

在此基础上,如果盐在密码更改之前和之后同样“难以”获得,我认为没有必要使用新的盐(它和以前一样处于危险之中)。它增加了额外的复杂性,而在实现复杂性时,大多数安全问题都会出现。

于 2009-09-23T06:40:58.953 回答