pbkdf2_sha256$20000$MflWfLXbejfO$tNrjk42YE9ZXkg7IvXY5fikbC+H52Ipd2mf7m0azttk=
Давайте разберем это вниз. $
сепараторы:
pbkdf2_sh256
означает PBKDF2-SHA256, т.е. hash_pbkf2('sha256', ...)
20000
является счетчик цикла
MflWfLXbejfO
это соль
tNrjk42YE9ZXkg7IvXY5fikbC+H52Ipd2mf7m0azttk=
, скорее всего, хэш.
Это вся информация, необходимая для проверки хеша из PHP. Вам просто нужно:
hash_pbkdf2()
создать новый хэш от пароля, предоставленного пользователем
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. Я не рекомендую добавлять обратную совместимость для версий PHP раньше 5.6; если вы окажетесь в этой ситуации, you should update your server software instead.
Я категорически не согласен с @Sayse - похоже, что он заменяет django на PHP, поэтому ответ не должен быть «запущен» – Fitblip