将用户密码从加盐 SHA1 升级到 bcrypt

Posted

技术标签:

【中文标题】将用户密码从加盐 SHA1 升级到 bcrypt【英文标题】:Upgrading user passwords from salted SHA1 to bcrypt 【发布时间】:2013-10-10 07:22:11 【问题描述】:

我受雇在新的 php 5.3 服务器上使用 Laravel 4 重建基于 CodeIgniter 1.7.3(在 PHP 4.2 服务器上)构建的积极使用的应用程序。

系统有大约 500 个用户,其密码使用加盐 SHA-1 哈希加密。我想使用 bcrypt 来增加应用程序的安全性以及与 Laravel 4 的身份验证系统集成。

您建议如何迁移这些用户的密码?

【问题讨论】:

我相信有很多 5.3.13 配置,所以请确保服务器至少运行 5.3.7。 【参考方案1】:

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

您有三个选择:

存储 SHA1 哈希的 bcrypt 哈希,然后对每个密码进行 SHA1 哈希,然后在每次登录时对其进行 bcrypt。这可能不是一个好主意

李>

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

将每个用户重置为随机 bcrypted 密码,并强制他们全部使用忘记密码将其改回。您可能不想这样做

【讨论】:

还有第三个选项,重置用户密码。这不是一个好的选择,但如果你提到了双重哈希,你也应该提到这一点。 @ElonThan:是的;我刚做了。 好点。之前没有正确考虑它,但选项 2 是有道理的。我将在用户表中添加一个 brcypt 字段,当用户登录时,我将对密码进行 bcrypt 散列并将其存储在新字段中,从记录中删除 SHA1 密码并添加一些条件逻辑以了解哪个字段比较,直到每个人都完全迁移。 @Nick:如果您有相当大的用户群,迁移所有人可能需要 很长时间 时间。 正如 SLaks 所说,这可能需要很长时间。也许最好为每一行存储一个“算法”,告诉系统要使用的算法,并在下次登录时更新到 bcrypt。这样您以后也可以更改您的算法,您不必担心返回并删除您的 SHA 列并为某些用户弄乱数据。【参考方案2】: 在数据库中添加一列,告诉系统使用了哪种哈希算法 登录时,正常检查凭据 如果他们使用旧密码并且登录成功 - 对他们输入的密码进行 bcrypt 并在数据库中更新他们的密码和算法。

【讨论】:

刚刚意识到这一点并评论了第一个答案!感谢您的帮助。【参考方案3】:

您可以为每个用户创建一个随机密码,并使用新密码向每个人发送一封通知电子邮件。但是,如果用户没有看到电子邮件,这将导致混乱。

我建议您为 bcrypt 值添加另一个 db 字段,然后在更改后用户第一次登录时创建一个条目。您可以使用单独的字段或删除旧的哈希来跟踪。

当您的活跃用户迁移后,您可以随意对其余用户群使用随机密码方法来完成迁移。

【讨论】:

刚刚意识到这一点并评论了第一个答案!感谢您的帮助。

以上是关于将用户密码从加盐 SHA1 升级到 bcrypt的主要内容,如果未能解决你的问题,请参考以下文章

将密码哈希从 md5 升级到 bcrypt [关闭]

使用mongoose和bcrypt实现用户密码加密

在 Android 应用程序中使用 jBCrypt 对密码进行加盐会导致长时间挂起

如何迁移密码哈希?

加盐哈希以验证明文(不是密码)

如何将密码文本与 bcrypt 哈希值进行比较?