我有散列密码是必须添加无盐,他们散列之前的数据库。 我想盐添加到新的密码。 很显然,我不能重新哈希现有的。
你将如何迁移到新的散列系统?
我有散列密码是必须添加无盐,他们散列之前的数据库。 我想盐添加到新的密码。 很显然,我不能重新哈希现有的。
你将如何迁移到新的散列系统?
你当然可以。 只是盐添加到现有哈希和再散列它。 当然,这需要未来的任何登录到经过同样的过程意味着两个散列函数将需要被调用,但很多合法的模式做到这一点无论如何所以它没有气味像你想的那样糟糕。
腌制密码是抵御彩虹表的努力。 在这种情况下,盐并不需要是一个秘密。
http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables
实际上,你可以看到在文章中
hash = MD5 (MD5 (password) . salt)
这是你将使用完全相同的方法。 (除不同的散列函数)。
作为速战速决,你可以在数据库中创建一个盐柱,当用户登录正确的匹配旧散列,你就可以使用他们与盐输入的密码,并创建一个新的哈希值。
你可以添加一列,其中包括显示用户是否有一个老 (无盐)的标志或新的 (盐)散列。
一个好主意是,在这一点上,以强制所有用户在注册时更改他们的密码,这样你就可以摆脱该列的最后。
我处理涉及多个散列技术类似的问题。 我用编码在数据库中的哈希方法类型以及(即“阿尔法”,“测试”,“伽马”,“增量”)的方法。 我打上相应级别的所有当前的哈希值。 当用户登录,我验证了使用更新的方法,他们的密码,并重新散列他们。 我们的密码后90天到期,所以这只是一个抱着3个月,直到使用老方法的所有密码可能被重置的问题。
还有这里的一些方法 ,可能为你工作。
请记住,您可以添加到现有哈希任何固定模式是无用的(该链接是在暗示这样的事情的招数之一)。 应该有可用于分离盐没有可识别的图案。
当然,最好的办法是迁移到一个咸鱼哈希表。
在你指定的数据库中创建一个新的领域“咸鱼”有型的真/假(或其他等值是在你的DBMS)。 设置所有值,以假为现有的哈希值。 如果添加了新的,咸,哈希值,设置了“咸鱼”字段设置为true。
然后,所有你需要做的是处理两类散列在不同的代码。
这比具体的一个通用的解决方案,但它应该解决您的问题。
如果要存储的哈希里面的盐,它应该是相当简单的,以确定是否盐是通过检查散列的长度包括在内。 如果没有盐,只是哈希密码,如果有盐,哈希密码+盐。
你不应该在你的数据库需要一个布尔列。
我存储我的盐,最好的办法是,我嵌入我刚才所创建的密码哈希+盐中的盐值。 我不添加盐的字符串的开头或哈希的结束,我从字面上嵌入到盐的哈希值。