如何在现有密码哈希值中加盐?

时间:2009-07-29 17:01:49

标签: security migration passwords salt

我有一个散列密码数据库,在散列之前没有添加盐。我想在新密码中加盐。显然我不能重新哈希现有的那些。

您将如何迁移到新的哈希系统?

8 个答案:

答案 0 :(得分:31)

当然可以。只需在现有哈希中添加一个盐并再次哈希即可。当然,这将要求任何未来的登录都要经过相同的过程,这意味着需要调用两个哈希函数,但是无论如何都要做很多合法的模式,所以它没有你想象的那么糟糕。

保存密码是为了防御彩虹表。在这种情况下,盐不需要是秘密。

http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

您实际上可以在文章中看到

hash = MD5 (MD5 (password) . salt)

这与您将使用的方法完全相同。 (除了不同的散列函数。)

答案 1 :(得分:14)

作为快速修复,您可以在数据库中创建一个salt列,当用户正确匹配旧哈希时,您可以使用他们输入的密码并创建一个新哈希。

答案 2 :(得分:2)

您可以添加一个列,其中包含一个标志,显示用户是否具有(无盐)或(带盐)哈希。

此时,一个好主意是强制所有用户在登录时更改密码。这样您最终可以删除该列。

答案 3 :(得分:1)

我处理了涉及多种散列技术的类似问题。我也使用了在数据库中编码哈希方法类型的方法(即'alpha','beta','gamma','delta')。我用适当的级别标记了所有当前的哈希值。当用户登录时,我验证了他们的密码并使用更新的方法重新散列它们。我们的密码在90天后过期,因此只需要保留3个月,直到使用旧方法的所有密码都可以重置。

答案 4 :(得分:0)

some ways here可能适合你。
请记住,您添加到现有哈希中的任何常量模式都是无用的(该链接上的一个技巧就是建议类似的东西)。应该没有可识别的模式可用于分离盐。

当然,最好的方法是迁移到盐渍哈希表。

答案 5 :(得分:0)

在您的数据库中创建一个名为“salted”的新字段,其类型为true / false(或DBMS中的等效项)。将现有哈希值的所有值设置为false。每当添加一个新的盐渍哈希时,将“盐渍”字段设置为true。

然后,您所要做的就是在代码中以不同方式处理两种类型的哈希值。

这是一个通用的解决方案,而不是特定的解决方案,但它应该可以解决您的问题。

答案 6 :(得分:0)

如果要将salt存储在哈希中,那么通过检查哈希的长度来确定是否包含salt应该是相当直接的。如果没有salt,只需哈希密码,如果有盐,则哈希密码+ salt。

您的数据库中不需要布尔列。

答案 7 :(得分:0)

我存储盐的最佳方式是将salt值嵌入我刚刚创建的密码hash + salt中。我没有将salt字符串附加到哈希的开头或结尾,我将盐嵌入哈希。