Пароль не проверяется с помощью функции password_verify

Я думаю, что я hashed пароль, используя функцию PASSWORD непосредственно из базы данных mysql (я делаю неправильно здесь?). И я пытаюсь проверить этот пароль с помощью этого кода:

  if($submit) { $first=$_POST['first']; $password=$_POST['password']; $hash="*85955899FF0A8CDC2CC36745267ABA38EAD1D28"; //this is the hashed password i got by using function PASSWORD in database $password=password_verify($password,$hash); $db = new mysqli("localhost", "root","","learndb"); $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'"; $result = $db->query($sql); $result=mysqli_num_rows($result); if($result>0) { session_start(); $_SESSION['logged_in'] = true; session_regenerate_id(true); header("Location:loginhome.php"); } } 

Но пароль не соответствует. Что мне здесь не хватает?

ОБНОВЛЕНИЕ :

После всех предложений я использовал password_hash из php-кода для хранения в базе данных.

 $db = new mysqli("localhost", "root","","learndb"); $password=password_hash('ChRisJoRdAn123',PASSWORD_DEFAULT); $sql="INSERT INTO admin (username,password)values('ChrisJordan','$password')"; $db->query($sql); 

все еще пароль не соответствует.

Невозможно выполнить поиск хеша соленых паролей в базе данных. Чтобы вычислить хеш, вам понадобится функция password_hash (), как вы уже сделали это правильно в инструкции insert.

 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

Чтобы проверить пароль, сначала нужно выполнить поиск только по имени пользователя (используется подготовленный запрос, чтобы избежать внедрения sql):

 $sql = 'select * from admin where username = ?'; $db->prepare($sql); $db->bind_param('s', $first); 

Когда вы, наконец, получите сохраненный хэш из базы данных, его можно проверить следующим образом:

 // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Это слишком долго для комментария.

Увидев, что этот вопрос еще не содержит зеленый галочку рядом с любым из ответов, я отправляю следующее, чтобы указать на вероятные проблемы.

Я заметил, что вы пытаетесь перейти с MD5 на password_hash()password_verify() .

  • Ваш другой вопрос Переключение с md5 на password_hash

Что вам нужно знать, так это то, что MD5 создает строку длиной 32 символа, а не password_hash() длиной 60.

  • Используйте varchar(255) .

Если вы сохранили длину столбца паролей до 32, вам нужно будет очистить существующие хэши из этого столбца, а затем ALTER, чтобы ваш столбец был равен 60 или 255, как предлагает руководство.

Вам нужно будет очистить все существующие пароли, ALTER ваш столбец, создать новый хеш, а затем снова попробовать свой код входа.

Я вижу это в вашем коде:

 "*85955899FF0A8CDC2CC36745267ABA38EAD1D28"; //this is the hashed password i got by using function PASSWORD in database 

Эта строка *85955899FF0A8CDC2CC36745267ABA38EAD1D28 40 длинная, слишком короткая и отрезанная.

Это говорит мне, что длина вашей колонки равна 40, а не 60, или снова, как предлагает руководство, 255.

Ссылка MD5:

Возвращает хэш как 32-значное шестнадцатеричное число.

Ссылка для password_hash() :

Результат всегда будет состоять из 60 символов или FALSE при сбое.

Для ALTER вашей колонки, здесь ссылка ссылки:

Также убедитесь, что ваша форма содержит метод POST и что входы содержат соответствующие атрибуты имени и что никакие пробелы не вводятся.

Вы можете использовать trim() чтобы избавиться от них.

Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.

 <?php error_reporting(E_ALL); ini_set('display_errors', 1); // Then the rest of your code 

Sidenote: Отображение ошибок должно выполняться только в стадии постановки и никогда не производить.

а также or die(mysqli_error($db)) в mysqli_query() .


Редактировать:

Что вам нужно сделать, это получить массив и получить совпадение.

 $sql = "select * from admin where username = '".$first."' and password = '".$password."' "; $result = $db->query($sql); if ($result->num_rows === 1) { $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($password, $row['password'])) { //Password matches, so create the session // $_SESSION['user']['user_id'] = $row['user_id']; // header("Location:/members"); echo "Match"; }else{ echo "The username or password do not match"; } } 

Другое возможное решение:

 $query = "SELECT * from admin WHERE username='$first'"; $result = $db->query($query); if($result->num_rows ===1){ $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($password, $row['password'])){ echo "match"; } else { $error = "email or Password is invalid"; echo $error; } } mysqli_close($db); // Closing Connection 

password_verify – это логическая функция, которая возвращает либо true либо false . В вашем коде после получения значения пароля из параметра «Пост» вы выполняете эту операцию

 $password=password_verify($password,$hash); 

который изменяет значение $password значение true или false и это логическое значение, хранящееся в $password вы используете в операторе select mysql

 $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'"; 

Другое дело, возможно, что используемый хешированный / соленый пароль не является правильным хэшированным паролем, который вы используете.


Обновление: попробуйте

 $cost = [ 'cost' => 15, ]; $hash_password = password_hash('ChRisJoRdAn123', PASSWORD_BCRYPT, $cost); 

перед любой операцией db измените длину password varchar на> = 64

 $sql = "INSERT INTO admin (username,password)values('ChrisJordan','".$hash_password."')"; 

После операции вставки выполните оператор select с пользователем

 $sql = "select * from admin where username = 'ChrisJordan'"; 

после того, как этот выбор hased password и password из параметра post , вам нужно будет проверить оба пароля с помощью password_verify

 if (password_verify(validate($_POST['password']), $hash_password_from_db)) { echo "Valid Password"; }else{ echo "Invalid Password"; } 

Вы должны использовать password_hash для кодирования паролей, проверенных с помощью password_verify .

Функция MySQL PASSWORD – это нечто совершенно другое. Он используется для кодирования паролей, специфичных для аутентификации MySQL. (MySQL специально рекомендует использовать PASSWORD для чего-либо, кроме аутентификации MySQL).

Оба используют разные алгоритмы хеширования, представляют их вывод в разных форматах и, как правило, несовместимы друг с другом.


Типичным способом использования password_hash и password_verify является:

 $hash = password_hash($password, PASSWORD_DEFAULT); //Store $hash in your database as the user's password //To verify: //Retrieve $hash from the database, given a username $valid = password_validate($password, $hash); 

Проблема в вашем коде заключается в том, что вы делаете это:

 $password=password_verify($password,$hash); $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'"; 

password_verify возвращает логическое значение (соответствует ли пароль и хэш). Вместо этого вам нужно получить хэш из базы данных и сопоставить введенный пароль с этим хешем.