【问题标题】:Migrate old md5 passwords to bcrypt passwords将旧的 md5 密码迁移到 bcrypt 密码
【发布时间】:2012-06-02 00:38:38
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails-3 hash devise md5 password-hash


【解决方案1】:

我有一个替代解决方案:

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

通过这种方式,所有密码都可以一次性迁移,并且 MD5 哈希值被永久丢弃。考虑自己这样做,不能对这个想法挑任何毛病。有接盘侠吗?我错过了什么明显的东西吗?

【讨论】:

  • 按照您的建议减少传递给 bcrypt 的数据的熵(即只传递哈希码而不是密码)可能会削弱 bcrypt 算法。我不知道情况是否如此,但这绝对值得 imo 进一步研究。
  • @Brann,这个方案显然是可行的。迭代 bcrypt 具有相同的熵减少效果,但被认为是安全的。所以这里没问题。
  • 我自己也想过这个问题。我只是一直想知道散列到 md5 是否会以某种方式降低安全性。我想到的另一种方法是,您可以在帐户上设置一个指示器,以指示密码是旧密码还是新密码。如果是新的,哈希到 md5 然后 bcrypt。如果是新的,只需 bcrypt。这将允许您完全转换现有数据库,因此您无需等待用户转换他们的旧密码。
  • 根据this reddit thread,在此之上,您可以包含一个额外的位字段“旧版”,然后每次验证“旧版”密码并取消设置旧版密码时将密码转换为plain text -> bcrypt场地。在接受的答案中也有@celicni commented
【解决方案2】:

Oleksi 和 josnidhin 在回答您的问题方面做得很好。我只是想补充一些想法,在过渡阶段应该做什么:

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

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

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

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

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

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

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

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

【讨论】:

  • 谢谢你的解释,现在我和Devise大吵了一架:D
  • 每次插入相应的 bcrypt 版本时,为什么不从 md5 列中删除条目?
  • 此外,还有一种更优雅的“散列散列”方法,因为您无需用户登录即可执行此操作。使用新的安全函数散列旧散列值。然后,当用户登录时,您使用旧函数对他的密码进行哈希处理,并使用新函数对结果进行哈希处理。
【解决方案3】:

您必须要求用户使用旧密码登录,然后更改它,例如显示一个强制更改密码页面,该页面将使用 bcrypt 存储密码。提供新密码后,您可以禁用/删除系统中的旧密码。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2015-02-04
      • 2013-04-24
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2020-06-27
      • 2016-12-11
      相关资源
      最近更新 更多