盐渍哈希和密码历史

时间:2009-09-23 06:29:28

标签: passwords history salt

想知道每次更改密码时,对于单个给定用户来说盐是否是唯一的,或者每次重复使用相同的盐是不是很重要。

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

嗯......这就是原因。我需要存储以前的X密码以确保密码不被重用。在过去(我最后一次为此编写代码),我可以存储以前的MD5哈希值,并将新的哈希值与该列表进行比较。好吧,现在我正在使用盐腌哈希,盐每次都是独一无二的,那些比较已不再可能,因为以前的盐不再为人所知。

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

后者工作量较少,但失去了什么力量?从实际的角度来看,我认为没有。以为我会在这里得到第二个意见。感谢。

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

4 个答案:

答案 0 :(得分:6)

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

我每次都会使用不同的盐。

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

编辑:为了解释我的意思,考虑一个4字符的盐,在密码前加上......为了争论,想象某人只在他们的密码中使用AZ,az和0-9(和盐) )。

如果您不提前知道盐(准备字典攻击时),那么为了准备所有8个字符“人类”密码的字典,您需要散列62 ^ 12个连接密码。但是,如果您总是知道串联密码的前4个字符是什么(因为您提前了解盐),那么您只能散列62 ^ 8值 - 所有那些以盐开头的值。它使盐对这种特殊的攻击毫无用处。

这仅适用于目标用户 - 并且只有在攻击者可以在密码更改之前和之后都进入哈希列表时才会使用。它基本上使得更改密码的效果不如安全措施。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

- 编辑:

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

其次,要考虑它是否重要,我们需要考虑盐的目的。这是为了防止对只有密码完整列表的人进行脱机攻击。

在此基础上,如果在密码更改之前和之后同样“难以”获取盐,我认为没有使用新盐(它就像之前一样冒险)。它增加了额外的复杂性,实现复杂性是大多数安全问题发生的地方。

答案 3 :(得分:0)

我可能在这里非常暗淡,但是,你会在哪里储存那些有足够访问权限来获取哈希密码的人无法访问的盐。