从使用盐值的SHA1升级用户密码到bcrypt

9
我被聘用来重建一个使用活跃度很高的应用程序,它是在 PHP 4.2 服务器上使用 CodeIgniter 1.7.3 构建的,现在需要在新的 PHP 5.3 服务器上使用 Laravel 4 进行重构。
系统中有大约 500 名用户,他们的密码使用带盐的 SHA-1 哈希进行加密。为了增强应用程序的安全性并与 Laravel 4 的身份验证系统集成,我想使用 bcrypt 加密方式。
你会如何建议迁移这些用户密码?

我认为有很多5.3.13配置存在,因此请确保服务器至少运行5.3.7。 - user1669496
3个回答

11

哈希的整个意义在于您无法恢复原始密码。

您有三个选项:

  • 在每次登录时,在bcrypt之前SHA1哈希每个密码,并存储SHA1哈希的bcrypt哈希值。
    这可能不是一个好主意。

  • 下次用户登录时升级每个哈希值(以便您拥有明文文本进行哈希)。
    这是最好的选择,但您需要保留SHA1哈希和转换代码,直到每个用户都登录

  • 将每个用户重置为随机生成的bcrypted密码,并强制他们都使用“忘记密码”来更改回密码。
    你可能不想这样做


1
还有第三个选项,重置用户密码。这不是一个好的选择,但如果你提到了双重哈希,你也应该提一下这个选项。 - Elon Than
@ElonThan:是的,我刚刚做了。 - SLaks
好的观点。之前没有仔细考虑,但选项2是有道理的。我会在用户表中添加一个bcrypt字段,当用户登录时,我会对密码进行bcrypt哈希处理并将其存储在新字段中,从记录中删除SHA1密码,并添加一些条件逻辑以知道要比较哪个字段,直到每个人都完全迁移为止。 - James
@Nick:如果你有一个庞大的用户群,迁移所有人很可能需要很长时间。 - SLaks
2
正如SLaks所说,这可能需要很长时间。也许最好为每一行存储一个“算法”,告诉系统要使用的算法,并在用户下次登录时更新到bcrypt。这样,您以后可以更改算法,而不必担心返回并删除SHA列并破坏某些用户的数据。 - Jonathon
显示剩余2条评论

8
  • 向数据库添加一列,用于告诉系统使用了哪个哈希算法
  • 登录时,按照正常流程检查凭据
  • 如果用户使用的是旧密码并且登录成功-对其输入的密码进行bcrypt加密,并在数据库中更新他们的密码和算法。

刚刚意识到这一点并在第一个回答中进行了评论!感谢你的帮助。 - James

1
你可以为每个用户创建一个随机密码,并发送通知电子邮件以告知他们的新密码。但是如果用户没有看到电子邮件,这将导致混淆。
我建议您添加另一个 db 字段用于 bcrypt 值,然后在用户更改后第一次登录时创建一个条目。您可以使用单独的字段或删除旧哈希来跟踪。
当您的活跃用户已经迁移时,请随意使用随机密码方法完成其余用户的迁移。

刚刚意识到这一点并在第一个答案上进行了评论!感谢您的帮助。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接