【问题标题】:Changing hash without losing database users在不丢失数据库用户的情况下更改哈希
【发布时间】:2016-08-21 15:18:28
【问题描述】:

我有这个网站,有一个简单的 CMS,当用户注册时,他们的密码会在 MD5 中加密。

但由于我不喜欢这种加密,而且我已经在重新构建我的 CMS,所以我也更改了哈希。

现在,他们是否可以通过另一种加密方法更改 MD5,而不会丢失我的数据库用户?

【问题讨论】:

  • 您可以使用 2 列的旧哈希和新哈希,直到所有用户再次使用新方法登录。
  • paragonie.com/blog/2016/02/how-safely-store-password-in-2016 - 有一个关于更新哈希的部分。
  • 如果您有密码重置功能。要求所有用户通过新的哈希方法重置密码
  • 非常感谢!还没有考虑创建第二个专栏,但我喜欢这个主意!我也会阅读这篇文章!谢谢大家。
  • @jarlh:你怎么知道它是 SQL-Server?

标签: php sql-server hash


【解决方案1】:

您可以在保存密码的数据库中添加 3 个新列。

newPassword, newSalt,isRequired

您可以在此处保存由新密码创建的新盐(如果使用 phps password_hash 之类的哈希)、新的哈希密码以及这是他们自哈希更新后的第一次登录尝试。

方法

您需要修改登录脚本以检查isRequired 是否为YES。如果是这样,请提取旧的哈希密码和旧盐,否则使用新密码和新盐。

对于所有当前用户,将 isRequired 设置为 YES。

在用户登录时,如果 isRequired 值为 YES,则将用户重定向到密码重置页面,否则继续正常操作。

此密码重置页面本质上是新的注册页面,但已针对当前用户进行了修改,因此他们不必根据您处理数据的方式创建新用户名等。

当用户重置他们的密码时,这将使用新方法进行哈希处理,并像往常一样存储在数据库中的“新”部分中,并将 isRequired 值设置为 NO..

对于新用户,请确保注册页面将他们的密码输入到newPassword一栏中,并将isRequired设为NO。

下线

最终当所有isRequired 值都为“否”时,您可以更新数据库和编码以删除所有不再使用的旧列,删除所有与 MD5 散列等相关的代码。

如果一些老用户仍然没有更改他们的密码,您可以删除他们的用户并让他们重新注册。也许向所有用户发送一封电子邮件,说明如果您在 x 天之前没有更新他们的密码,他们的数据将被删除,他们将不得不重新注册。

【讨论】:

  • 你真的不应该在密码哈希上使用你自己的盐,你真的应该使用 PHP 的 built-in functions 来处理密码安全。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
  • @JayBlanchard 当我说自己的盐时,我的意思是创建一个诸如$random_salt = mcrypt_create_iv(24, MCRYPT_DEV_URANDOM);
  • 由于 PHP 函数有一个内置的随机盐生成器并将盐与哈希一起存储,因此不需要额外的代码。
  • @JayBlanchard 虽然如此,但这篇文章是理论上的和“如何做”而不是具体的代码。 OP 可以决定如何生成自己的盐。
  • 真实数据@Matt。无论如何,我喜欢你解决问题的方法,我会用它来解决类似的问题。我几乎已经掌握了方法,但是阅读您的帖子为我巩固了它! ¯\_(ツ)_/¯
【解决方案2】:

MD5 是散列 - 不是加密。它不包含所有数据 - 就像数据的标识符一样工作。所以无法解密。所以基本上你不能在不妨碍他们的情况下将现有用户的密码更改为你自己的加密。

更多学习:

http://en.wikipedia.org/wiki/MD5#Algorithm

https://stackoverflow.com/a/2717958/926943

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多