如何从 MD5 转换为任何其他哈希值?

How to I convert from MD5 to any other hash?

我刚刚下载了他多年前使用的我最好的朋友脚本,所有密码都使用我想更改的 MD5 哈希。现在我不太擅长编码所以我问你们从哪里开始。我是在数据库中还是在脚本中转换它?我希望从现在开始每个注册的人都有另一个哈希值,我在考虑 SHA-2。

所以我想在我要更改为 SHA-2 的代码中应该有一些说 md5 的东西?我对吗?如果这里有人能告诉我代码中的 MD5 散列是什么样的,我可以在每个文件中搜索它,直到找到为止。也请告诉我如何将它替换为 SHA-2。

谢谢。

因为您无法解密 MD5,所以您可以像这样处理迁移并使其对用户不可见:

一旦您决定了要使用的散列方法(我建议使用 PHP 的 built-in functions 来处理密码安全。):

  1. 根据要采用的哈希方法,为新哈希向用户数据库添加一个新列。
  2. 在用户登录时检查 table 以查看他们是否有 MD5 密码(并且匹配)并查看是否已输入新的哈希值。

    一个。如果他们没有新哈希,请根据他们登录时使用的密码在新列中创建一个。

    b。如果他们确实有新哈希值,请根据新哈希值验证他们的密码。

在某个时刻,每个用户都会通过登录更新自己的哈希值。


此外,请确保您 或在散列之前对它们使用任何其他清理机制。这样做 会更改 密码并导致不必要的额外编码。

md5 哈希函数称为 md5("my password")hash("md5", "my password")。您可以用 hash("sha256", "my password")hash("sha512", "my password").

替换

但是...

这些也不是很安全。使用建议的 password_hash() 函数。此函数非常简单:password_hash(string $password , integer $algorithm),其中算法是 PASSWORD_* 常量之一。

阅读功能页的注释,read these notes for the algorithm

我喜欢 Jay 的回答,但还有更好的方法。

您的数据库中需要另一个字段。在这个例子中,我们称它为 legacy。这是一个简单的 Yes/No,默认为 No。你所做的就是获取你拥有的所有 MD5 哈希并将它们推入 password_hash。然后你在 MD5 上写入新的哈希并将 legacy 设置为 Yes

当你去登录时,你会提取他们的记录(基于用户名),然后你会得到密码和 legacy 字段。然后你做这样的事情

$password = $_POST['password'];
// $result is the result from your query. I like arrays so we'll use that
if($result['legacy'] == 'Yes') $password = md5($password);
if(password_verify($password, $result['password']))

这有两个作用

  1. 您不需要先知道 MD5 哈希值中的内容
  2. 无论如何,您仍在使用 password_hash

请记住,如果他们更新密码,请将 legacy 字段设置为