gpt4 book ai didi

php - PHP 中的 Django 密码

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:05 24 4
gpt4 key购买 nike

我有一个问题,因为我有一个包含用户的数据库,他们的密码是用 Django (pbkdf2) 保护的。所以“123”看起来像这样:

pbkdf2_sha256$20000$MflWfLXbejfO$tNrjk42YE9ZXkg7IvXY5fikbC+H52Ipd2mf7m0azttk=

现在我需要在 PHP 项目中使用这个密码,但我不知道如何比较它们。

最佳答案

pbkdf2_sha256$20000$MflWfLXbejfO$tNrjk42YE9ZXkg7IvXY5fikbC+H52Ipd2mf7m0azttk=

让我们分解一下。 $ 是分隔符:

  • pbkdf2_sh256 表示 PBKDF2-SHA256,即 hash_pbkf2('sha256', ...)
  • 20000 是迭代次数
  • MflWfLXbejfO 是盐
  • tNrjk42YE9ZXkg7IvXY5fikbC+H52Ipd2mf7m0azttk= 可能是哈希值。

这是从 PHP 验证散列所需的全部信息。你只需要:

  1. hash_pbkdf2()从用户提供的密码生成新的散列
  2. hash_equals()将生成的哈希值与存储的哈希值进行比较

这个函数应该可以工作(PHP 7+):

/**
* Verify a Django password (PBKDF2-SHA256)
*
* @ref http://stackoverflow.com/a/39311299/2224584
* @param string $password The password provided by the user
* @param string $djangoHash The hash stored in the Django app
* @return bool
* @throws Exception
*/
function django_password_verify(string $password, string $djangoHash): bool
{
$pieces = explode('$', $djangoHash);
if (count($pieces) !== 4) {
throw new Exception("Illegal hash format");
}
list($header, $iter, $salt, $hash) = $pieces;
// Get the hash algorithm used:
if (preg_match('#^pbkdf2_([a-z0-9A-Z]+)$#', $header, $m)) {
$algo = $m[1];
} else {
throw new Exception(sprintf("Bad header (%s)", $header));
}
if (!in_array($algo, hash_algos())) {
throw new Exception(sprintf("Illegal hash algorithm (%s)", $algo));
}

$calc = hash_pbkdf2(
$algo,
$password,
$salt,
(int) $iter,
32,
true
);
return hash_equals($calc, base64_decode($hash));
}

演示:https://3v4l.org/WbTpW

如果您需要旧版 PHP 5 支持,从函数定义中删除 string 前缀和 : bool 将使其在 PHP 5.6 上运行。我不建议尝试为 5.6 之前的 PHP 版本添加向后兼容性;如果您发现自己处于这种情况,you should update your server software instead .

关于php - PHP 中的 Django 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39310898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com