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