PHPass отказывается проверять хэши
include 'lib/php/PasswordHash.php';
$hash = $_GET['hash'];
$pass = $_GET['pass'];
$hasher = new PasswordHash(8, false);
$pass = $hasher->HashPassword($pass);
echo "Original:<br>" . $pass . "<br>";
$checked = $hasher->CheckPassword($pass, $hash);
echo "Hashed:<br>" . $checked . "<br>";
echo "<br>";
echo "Are they equal? <b>";
if($pass == $checked){ echo "Yep!</b>";} else{
echo "Nope. </b>";
}
Невероятно простой фрагмент кода выше не работает совсем так, как задумано. Да, переменная pass хэшируется и выводится правильно, но CheckPassword() не может ничего вывести вообще. Я протестировал просто простое слово "привет" и вставил их непосредственно в функцию (например, CheckPassword('$2...', '$2...'); и он по-прежнему ничего не выводит.
Я работаю на Windows XAMPP, и я просто вынужден был прийти к выводу, что проблема должна быть. Я использовал этот код, а не сам проект, чтобы удалить базу данных как фактор, и нашел эту проблему.
Постарайтесь удержать себя от рвоты из-за уродства кода, но это отчаянная попытка заставить его работать.
Если вы запускаете этот код самостоятельно, вам нужно поместить переменную GET 'pass' и 'hash' в URL, чтобы проверить это. Скорее всего, я где-то допустил ужасную ошибку, поэтому я не уверен, что виню в этом свое окружение.
РЕДАКТИРОВАТЬ:
Я использовал приведенный ниже код для генерации начальной переменной для использования в URL
$hash = $_GET['hash'];
$hasher = new PasswordHash(8, false);
$hash = $hasher->HashPassword($pass);
echo $hash;
1 ответ
Вы используете CheckPassword
неправильно. Первый аргумент должен быть простым текстом; второй хеш, согласно документации. Вы устанавливаете $pass
к хешированному значению, а затем использовать его в качестве первого аргумента в CheckPassword
тем не мение.
Исправленный код (не проверено):
include 'lib/php/PasswordHash.php';
$hash = $_GET['hash'];
$pass = $_GET['pass'];
$hasher = new PasswordHash(8, false);
// Just delete this line: $pass = $hasher->HashPassword($pass);
echo "Original:<br>" . $pass . "<br>";
$checked = $hasher->CheckPassword($pass, $hash);
echo "Hashed:<br>" . $checked . "<br>";
echo "<br>";
echo "Are they equal? <b>";
if($pass == $checked){ echo "Yep!</b>";} else{
echo "Nope. </b>";
}
PS Я не уверен, почему вы пытаетесь получить значение $hash
от $_GET
, Если вы позволите пользователю указать и пароль, и хеш, они могут обмануть ваше приложение и предоставить доступ. Я предполагаю, что это всего лишь тест, и вы будете использовать базу данных или другое безопасное хранилище в вашем реальном приложении.