更改哈希值而不丢失数据库用户

4
我有一个网站,使用简单的CMS,当用户注册时,他们的密码被加密为MD5格式。
但是由于我不喜欢这种加密方式,而且我已经在重新构建我的CMS,所以我也改变了哈希值。
现在,有没有一种方法可以将MD5更改为另一种加密方法,而不会失去我的数据库用户?

1
你可以使用两列,分别记录旧哈希和新哈希,直到所有用户再次使用新方法登录。 - juergen d
3
请查看https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016,其中有一个关于更新哈希的部分。 - iainn
1
如果您有密码重置功能,请要求所有用户通过新的哈希方法重置其密码。 - Matt
@jarlh: 你怎么知道它是SQL Server? - juergen d
@juergend,哎呀,我是不是太草率下结论了? - jarlh
显示剩余3条评论
2个回答

4
您可以在数据库中添加3列,用于保存密码。
分别为:newPasswordnewSaltisRequired
您可以将新密码(如果使用像PHP的password_hash一样的哈希)生成的新盐保存在此处,以及新的哈希密码,还可记录此次登录是否是用户首次尝试使用哈希更新后的密码。 操作方法 您需要修改登录脚本,检查isRequired是否设置为YES。 如果是,请提取旧哈希密码和旧盐;否则使用新密码和新盐。
对于所有当前用户,请将isRequired设置为YES。
在用户登录时,如果isRequired的值为YES,则将用户重定向到密码重置页面;否则继续正常登录。
这个密码重置页面实际上就是新的注册页面,但针对当前用户进行了修改,使得他们不必创建新的用户名等信息,具体如何处理数据取决于您。
当用户重置密码时,此密码将使用新方法进行哈希处理,并像往常一样存储在“ new”部分中,并将isRequired的值设置为NO。
对于新用户,请确保注册页面将其密码放入newPassword列中,并将isRequired设置为NO。 长远规划 最终,当所有isRequired的值都为NO时,您可以更新数据库和编码,删除不再使用的所有旧列,并删除所有与MD5哈希相关的代码。
如果一些旧用户仍未更改其密码,则可以删除其用户并让他们重新注册。 可以向所有用户发送电子邮件,告知他们如果在x天之前未更新密码,其数据将被移除,并且他们必须重新注册。

你真的不应该在密码哈希中使用自己的盐,而是应该使用PHP的内置函数来处理密码安全。确保在哈希之前不要转义密码或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编程。 - Jay Blanchard
@JayBlanchard 当我说“自己的盐”时,我的意思是创建一个,例如 $random_salt = mcrypt_create_iv(24, MCRYPT_DEV_URANDOM); - Matt
由于PHP函数具有内置的随机盐生成器并将盐与哈希一起存储,因此无需额外的代码。 - Jay Blanchard
@JayBlanchard 虽然如此,这篇文章是理论性的和“如何”而不是具体的代码。原帖作者可以决定如何生成自己的盐。 - Matt
真的呢,@Matt。无论如何,我喜欢你对这个问题的处理方式,我将在类似的问题上使用它。我几乎已经想到了这种方法,但是阅读你的帖子为我巩固了它!¯\(ツ) - Jay Blanchard
@JayBlanchard 很高兴它也对你有所帮助 :) - Matt

2

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