如何从 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 来处理密码安全。):
- 根据要采用的哈希方法,为新哈希向用户数据库添加一个新列。
在用户登录时检查 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']))
这有两个作用
- 您不需要先知道 MD5 哈希值中的内容
- 无论如何,您仍在使用
password_hash
请记住,如果他们更新密码,请将 legacy
字段设置为 否
我刚刚下载了他多年前使用的我最好的朋友脚本,所有密码都使用我想更改的 MD5 哈希。现在我不太擅长编码所以我问你们从哪里开始。我是在数据库中还是在脚本中转换它?我希望从现在开始每个注册的人都有另一个哈希值,我在考虑 SHA-2。
所以我想在我要更改为 SHA-2 的代码中应该有一些说 md5 的东西?我对吗?如果这里有人能告诉我代码中的 MD5 散列是什么样的,我可以在每个文件中搜索它,直到找到为止。也请告诉我如何将它替换为 SHA-2。
谢谢。
因为您无法解密 MD5,所以您可以像这样处理迁移并使其对用户不可见:
一旦您决定了要使用的散列方法(我建议使用 PHP 的 built-in functions 来处理密码安全。):
- 根据要采用的哈希方法,为新哈希向用户数据库添加一个新列。
在用户登录时检查 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']))
这有两个作用
- 您不需要先知道 MD5 哈希值中的内容
- 无论如何,您仍在使用
password_hash
请记住,如果他们更新密码,请将 legacy
字段设置为 否