我有一个散列密码数据库,在散列之前没有添加盐。我想在新密码中加盐。显然我不能重新哈希现有的那些。
您将如何迁移到新的哈希系统?
答案 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字符串附加到哈希的开头或结尾,我将盐嵌入哈希。