Как получить пароль из базы данных с помощью password verify ()?


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

Моя проблема с файлом входа в систему, я не могу сопоставить пользователя с паролем, который он мне дал. Для проверки пароля пользователя я использую функцию password_verify(), но она, похоже, работает неправильно.

Здесь это мой код:

Зарегистрируйтесь

<?php
//signUp.php
//Here is where I add a user in my database
//I validate the input, confirm that the password is written like it  should be
//check if a user with the same username exists in the database
//if all checks out I will add the user in the database
   //and redirect the user to his profile
   require_once 'login.php';
   require_once 'helperFunctions.php';

$conn = new mysqli($servername, $username, $password, $database);

if(!$conn)
   die("Connection failed:" . mysqli_connect_error());

$myUsername = $_POST['Name'];
$myPassword = $_POST['Password'];
$myConfirm = $_POST['conPass'];

sanitize($conn, $myUsername);
sanitize($conn, $myPassword);

//check if the two passwords are the same

if($myPassword != $myConfirm){
  print "Your passwords don't match";
  header("refresh: 5; index.html");
} else {
   //check if username already exists in database
    $query = "SELECT * FROM members WHERE Username='$myUsername'";
    $result = mysqli_query($conn, $query);

    $count  = mysqli_num_rows($result);

    if($count == 0){
        //hash password
        $hashedPass = password_hash("$myPassword", PASSWORD_DEFAULT);

        //username doesn't exist in database 
        //add user with the hashed password
        $query ="INSERT INTO members (Username, Password) VALUES     ('{$myUsername}', '{$hashedPass}')";
        $result = mysqli_query($conn, $query);

        if(!$result)
            die("Invalid query: " . mysqli_error());
        else{
            print "You are now a member or The Social Network";
            header("refresh: 5; login_success.php");
        }

    } else {
        print "Username already exists";
        header("refresh: 5; index.html");
    }

}
?>

Login

<?php
//checkLogin.php
//Here is where I authenticate my users and if successfull I will show  them their profile
require_once 'login.php';
require_once 'helperFunctions.php';

$conn = new mysqli($servername, $username, $password, $database);

if(!$conn)
    die("Connection failed:" . mysqli_connect_error());

//Values from form
$myUsername = $_POST['Name'];
$myPassword = $_POST['Password'];

//sanitize input
sanitize($conn, $myUsername);
sanitize($conn, $myPassword);

$query = "SELECT * FROM members WHERE Username='$myUsername'";
$result = mysqli_query($conn, $query);
$count = mysqli_num_rows($result);

if($count == 1){
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    print "hashedPass = ${row['Password']}";
    print "myPassword: " . $myPassword;
    if(password_verify($myPassword, $row['Password'])){
        print "Password match";
    } else
        print "The username or password do not match";
} 
?>

Функция дезинфекции

    function sanitize($conn, $val){
    $val = stripslashes($val);
    $val = mysqli_real_escape_string($conn, $val);
}

При запуске программы print "hashedPass = ${row['Password']}"; выводится хэшированный пароль, который совпадает с тем, который у меня есть в базе данных, но по какой-то причине я перенаправляюсь на оператор print "The username or password do not match"; после этого.

1 3

1 ответ:

Комментарий извлечен и взят из удаленного ответа:

"я вспомнил, что когда я впервые создал базу данных, я использовал CHAR(10) для паролей, в то время как хэшированный пароль требует больше символов."

Таким образом, всемогущий ответ здесь заключается в том, что ваш столбец пароля короче на 50 символов.

Password_hash () создает строку из 60 символов.

Руководство утверждает, что лучше всего использовать VARCHAR и с длиной 255 для того, чтобы приспособить для будущего изменения.

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

Пример из руководства:

<?php
/**
 * We just want to hash our password using the current DEFAULT algorithm.
 * This is presently BCRYPT, and will produce a 60 character result.
 *
 * Beware that DEFAULT may change over time, so you would want to prepare
 * By allowing your storage to expand past 60 characters (255 would be good)
 */
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
?> 

Приведенный выше пример выведет нечто подобное:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3jq7kned1rvagv3fykk1a

Также из руководства:

Осторожно Использование PASSWORD_BCRYPT для параметра algo приведет к тому, что параметр password будет усечен до максимальной длины 72 символов.

PASSWORD_DEFAULT - используйте алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения с течением времени по мере добавления новых и более сильных алгоритмов в PHP. По этой причине длина результата от использования этого идентификатора может изменяться с течением времени. Поэтому рекомендуется хранить результат в столбце базы данных это может расширяться за пределы 60 символов (255 символов были бы хорошим выбором).

PASSWORD_BCRYPT - используйте алгоритм CRYPT_BLOWFISH для создания хэша. Это приведет к созданию стандартного крипто-совместимого хэша с использованием идентификатора " $2y$". Результат всегда будет 60 символьную строку, или false в случае возникновения ошибки.
Поддерживаемые Опции:

Еще один комментарий / вопрос, извлеченный из удаленного ответа:

"Могу ли я изменить свое поле пароля без нужно удалить мою таблицу и начать с самого начала?"

Ответ-да. Смотрите этот вопрос и ответ на стеке:

Вы также можете проконсультироваться:

Sidenote: вам все равно потребуется повторно ввести новые хэши для (старых) затронутых столбцов.

Плюс, как уже говорилось; Вы открыты для SQL инъекция. Используйте подготовленное утверждение: