Как сопоставить введенный пароль с хешированным паролем из базы данных?

По некоторым причинам я не знаю, действительно ли я получаю хешированный пароль из базы данных или я сравниваю его прямо с введенным паролем. Я успешно проверил мою регистрацию в password_hash метод, и я вижу хешированный пароль в базе данных.

Должен ли я также хешировать введенный пароль для сравнения с хешированным паролем из базы данных? Или мой запрос просто неверен? Пожалуйста помоги!!! Спасибо!

<?php
require "../connection.php";

session_start();

    if(isset($_POST['login'])) {

    $username = stripslashes($_POST['username']);
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = stripslashes($_POST['password']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);

    $query = mysqli_query ($conn, "SELECT * FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
    $reader = mysqli_num_rows($query);

        if ($reader == 1) {
            $passwordQuery = mysqli_query ($conn, "SELECT password FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
            $row = mysqli_fetch_array($passwordQuery);
            $hashedPasswordFromDb = $row['password'];
            if (password_verify($password, $hashedPasswordFromDb)) {
                $query = mysqli_query ($conn, "SELECT id, student_number FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
                $row = mysqli_fetch_array($query);
                $id = $row['id'];
                $student_number = $row['student_number'];
                $sesData = array('id' => $id, 'student_number', $student_number);
                $_SESSION['ses_account'] = $sesData;
                mysqli_query ($conn, "UPDATE admin SET lastLogin=NOW() WHERE student_number='$student_number'");
                header("location: dashboard.php");
            } else {
                $msg="User not recognized. Please try again.";
                urlencode($msg);
                header("location: ../index.php?errmsg=$msg");
            }
        } else {
            $msg="User not recognized. Please try again.";
            urlencode($msg);
            header("location: ../index.php?errmsg=$msg");
        }
    }
?>

1 ответ

Решение

Я предполагаю, что вы храните хешированные пароли в базе данных (это хорошо)

но здесь:

$query = mysqli_query ($conn, "SELECT * FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));

Вы выбираете пользователя, сравнивающего хешированный пароль с открытым текстом. Таким образом, запрос никогда не вернет какую-либо строку / пользователя.


Вот как вы должны приступить к внедрению очень простой системы: 1 для регистрации пользователя и 2 для проверки входа в систему.

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

1 При регистрации нового пользователя сохраните имя пользователя и хешированный (и, возможно, соленый) пароль в БД.

2 Когда вы проверяете вход в систему, хэшируйте / разрабатывайте пароль в виде простого текста, который вы получаете в качестве ввода (с тем же процессом, который вы использовали при регистрации), затем создайте один SELECT получить пользователя по имени пользователя и, наконец, проверить совпадения хешированного пароля.


Предполагая, что вы хотя бы на PHP 5.5, используйте password_hash и password_verify для хеширования пароля (password_hash) и проверьте незашифрованный пароль в открытом виде (password_verify)

Далее читаем здесь: Безопасный хеш и соль для паролей PHP

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