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, Если вы позволите пользователю указать и пароль, и хеш, они могут обмануть ваше приложение и предоставить доступ. Я предполагаю, что это всего лишь тест, и вы будете использовать базу данных или другое безопасное хранилище в вашем реальном приложении.

Другие вопросы по тегам