将旧的md5密码迁移到bcrypt密码

Mar*_*nez 16 hash md5 password-hash devise ruby-on-rails-3

我正在使用Devise重新编写Rails中的网站进行身份验证.以前的网站使用具有md5密码的用户数据库,因此我想将此密码迁移到Devise使用的加密.我该如何解决?

emb*_*oss 20

Oleksi和josnidhin在回答你的问题方面做得很好.我只是想在过渡阶段添加一些想法:

将数据库迁移到两个"密码哈希"列,一个包含现有的旧MD5哈希值,另一个包含新的bcrypt哈希值,最初全部填充为NULL.用户下次登录时,您执行以下步骤:

1)检查bcrypt列中是否已有值.如果是这样继续3.,否则用2.

2)使用MD5列中的值使用旧的MD5机制对用户进行身份验证.如果成功,另外计算新的bcrypt哈希并将其存储在新列中.完成.

3)使用brypt值对用户进行身份验证.只需忽略MD5值即可.

然后,不时检查新的bcrypt列是否已填满.如果是这样,请丢弃MD5列并更新您的应用程序以仅使用新机制.

但这是一厢情愿的想法,总有一些用户在此期间没有登录.给他们发邮件告诉他们你在做什么,这是最好的,并请他们尽快登录.

几周后,再次检查bcrypt状态.如果还有一些密码丢失(会有:)),你可以做的只是重置这些用户的密码,生成一个随机密码并通过邮件通知他们,就像他们忘记密码时会做的那样.

然后,您最终可以清除MD5列,丢弃相应的代码并升级您的应用程序以仅使用新的身份验证.

  • 此外,还有"哈希哈希"方法更优雅,因为您可以在没有用户登录的情况下执行此操作.哈希旧的哈希值具有新的安全功能.然后,当用户登录时,使用旧函数对其密码进行哈希处理,并使用新函数对结果进行哈希处理. (5认同)
  • 为什么每次插入相应的bcrypt版本时都不从md5列中删除条目? (2认同)

Igo*_*aka 13

我有另一种解决方案:

  1. 添加bcrypt列.
  2. 通过bcrypt算法运行MD5哈希来填充bcrypt列.
  3. 将登录更改为始终使用bcrypt列和散列函数plain text->md5->bcrypt.

这样,可以一次迁移所有密码,永久丢弃MD5哈希值.考虑到自己这样做,不能用这个想法挑选任何错误.任何接受者?我错过了一些明显的东西吗

  • 如你所建议的那样,减少传递给bcrypt的数据的熵(即仅传递哈希码而不是密码)可能会削弱bcrypt算法.我不知道是否是这种情况,但这绝对值得进一步研究. (3认同)
  • @Brann,这个计划显然是可行的.迭代bcrypt具有相同的熵减少效果,但被认为是安全的.所以这里没问题. (2认同)

Ole*_*ksi 6

没有办法将md5哈希转换为另一种哈希.您必须使用旧系统登录用户,然后使用新方法散列他们提供的密码.获得新哈希后,可以删除旧的md5哈希.