12

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

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

4

8 回答 8

31

你当然可以。只需向现有哈希添加盐并再次对其进行哈希处理。当然,这将要求任何未来的登录都经过相同的过程,这意味着需要调用两个哈希函数,但许多合法模式无论如何都会这样做,所以它不会像你想象的那么糟糕。

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

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

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

hash = MD5 (MD5 (password) . salt)

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

于 2009-07-29T17:05:28.787 回答
14

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

于 2009-07-29T17:05:37.150 回答
2

您可以添加一个列,该列由一个标志组成,该标志显示用户是的(无盐)还是的(有盐)散列。

一个好主意是,在这一点上,强制所有用户在登录时更改他们的密码。这样你最终可以摆脱该列。

于 2009-07-29T17:05:35.107 回答
1

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

于 2010-02-03T17:39:09.170 回答
0

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

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

于 2009-07-29T17:06:15.697 回答
0

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

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

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

于 2009-07-29T17:08:02.947 回答
0

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

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

于 2009-07-29T17:15:14.287 回答
0

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

于 2009-12-11T21:12:16.727 回答