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

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

有帮助吗?

解决方案

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

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

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

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

hash = MD5 (MD5 (password) . salt)

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

其他提示

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

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

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

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

这里有某些方式为你工作。
请记住,您添加到现有哈希中的任何常量模式都是无用的(该链接上的一个技巧就是建议类似的东西)。应该没有可识别的模式可用于分离盐。

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top