15

我有一个旧应用程序,它的用户密码存储在数据库中,带有 MD5 哈希值。我想用 SHA-2 系列中的东西替换它。

我已经想到了两种可能的方法来实现这一点,但都显得相当笨拙。

1)添加一个布尔“标志”字段。在此之后用户第一次进行身份验证时,将 MD5 密码哈希替换为 SHA 密码哈希,并设置标志。然后我可以检查标志以查看密码哈希是否已被转换。

2) 添加第二个密码字段来存储 SHA 哈希。在此之后用户第一次进行身份验证时,使用 SHA 对密码进行哈希处理并将其存储在新字段中(可能同时删除他们的 MD5 哈希)。然后我可以检查SHA字段是否有值;这基本上成为我的旗帜。

在任何一种情况下,对于不经常登录的任何用户,MD5 身份验证都必须保留一段时间。任何不再活跃的用户将永远不会切换到 SHA。

有一个更好的方法吗?

4

7 回答 7

11

基本相同,但可能比添加额外字段更优雅:在Django的默认身份验证框架中,密码哈希存储为如下构造的字符串:

hashtype$salt$hash

Hashtype 是 sha1 或 md5,salt 是一个随机字符串,用于对原始密码进行加盐,最后是哈希本身。示例值:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
于 2009-09-04T20:49:25.337 回答
6

如果您通过首先对它们进行 MD5 处理来创建未来的密码,则可以通过在数据库中重新散列它们来将所有 MD5 字符串转换为 SHA1。检查密码也需要先对它们进行 MD5 处理,但我认为这不是什么大问题。

php代码(登录):

上一页: $login = (md5($password) == $storedMd5PasswordHash);

之后: $login = (sha1(md5($password)) == $storedSha1PasswordHash);

也适用于盐渍,从这里得到最初的想法。

于 2009-10-20T13:22:17.147 回答
3

我认为你已经有了最好的可能性。我喜欢#1 多于#2,因为一旦设置了sha,md5 就没有用了。

没有办法反转 MD5,因此您必须等待用户再次进行身份验证才能创建新的哈希。

于 2009-09-04T20:45:55.797 回答
2

不 - 基本上你必须保留 MD5,直到你关心的所有用户都被转换。这只是散列的本质——您没有足够的信息来再次执行转换。

与其他选项保持一致的另一个选项是使密码字段有效地自我描述,例如

MD5:(md5 hash)
SHA:(sha hash)

然后,您可以轻松检测用于比较的算法,并避免使用两个字段。同样,您将在进行过程中使用 SHA 覆盖 MD5。

您需要进行初始更新以使所有当前密码都声明为 MD5。

于 2009-09-04T20:46:40.897 回答
0

你的第二个建议对我来说是最好的。这样,频繁的用户将在未来获得更安全的体验。

第一个有效的“怪癖模式”是您的代码库,只确保新用户拥有更好的 SHA 体验。

于 2009-09-04T20:46:14.110 回答
-1

如果 MD5 没有加盐,您始终可以使用解密站点/彩虹表,例如: http: //passcracking.com/index.php来获取密码。不过,使用重新编码方法可能更容易。

于 2009-09-04T20:48:25.323 回答
-4

是的,在将其转换为 sha-1 之前,您应该先知道真实密码。

如果你想从 md5 加密字符串中找到真​​正的密码,你可以试试md5pass.com

于 2010-10-19T12:32:31.627 回答