kmllev Ответов: 1

Password_verify не работает должным образом?


Этот блок кода возвращает "успех":
$sql = "SELECT * FROM users WHERE username='$username'";
                $query = $this->db->query($sql);
                $count = $query->num_rows();

                if ($count == 1)
                {
                    $row = $query->row();
                    $hash = $row->password;
                    $hash = '$2y$10$zF/7n3QOAq9ADh2S4kBZBuz94QNzCA0GyRfd1WT7JqNhDVpcXQgEq';
                    $pass = 'hello';
                    if (password_verify($pass, $hash)) {
                        return "success";
                    }

                    else
                    {
                        $data = "Hash: " .$hash." Password:".$pass;
                        return $data;
                    }
                }

                else
                {
                    return "zero rows";
                }



Но когда я меняю его на этот (я комментирую второй хэш $):
$sql = "SELECT * FROM users WHERE username='$username'";
                $query = $this->db->query($sql);
                $count = $query->num_rows();

                if ($count == 1)
                {
                    $row = $query->row();
                    $hash = $row->password;
                    //$hash = '$2y$10$zF/7n3QOAq9ADh2S4kBZBuz94QNzCA0GyRfd1WT7JqNhDVpcXQgEq';
                    $pass = 'hello';
                    if (password_verify($pass, $hash)) {
                        return "success";
                    }

                    else
                    {
                        $data = "Hash: " .$hash." Password:".$pass;
                        return $data;
                    }
                }

                else
                {
                    return "zero rows";
                }

Он возвращает следующее сообщение:
Hash: $2y$10$zF/7n3QOAq9ADh2S4kBZBuz94QNzCA0GyRfd1WT7JqNhDVpcXQgEq Password:hello


Что может быть не так?

Что я уже пробовал:

Попробовал поискать в stackoverflow, но не смог найти ответов

1 Ответов

Рейтинг:
0

Peter Leow

Вот что это такое. Вы первое место для посещения должны быть PHP: password_verify-руководство пользователя[^] не stackoverflow.
То

password_verify($pass, $hash)

будет хэшировать ваше значение $pass и сравнивать его со значением $hash, возвращает true, если совпадение else false.


kmllev

Проблема в том, что метод не сравнивает точно такие же значения? В основном я скопировал значение из базы данных и вставил его в переменную для отладки в 1-м блоке. В 1-м блоке я просто сделал переопределение значений, чтобы проверить, правильно ли он работает. 2-й блок кода извлекает соответствующий хэш из базы данных и возвращает тот же хэш/значение, что и в 1-м блоке. Что меня смущает, так это то, почему он возвращает false, когда значения не изменяются, как видно из сообщения, возвращаемого 2-м блоком.
Может быть, я что-то упускаю, так как извлекаю значение из базы данных? Какой-то разбор нужен?

Peter Leow

По-видимому, ваше хэш-значение из вашей базы данных и значение из password_verify () - это не одно и то же. На самом деле, если вы посмотрите на документацию, она использует password_hash() для выполнения хэширования в PHP. Читать http://php.net/manual/en/function.password-hash.php
Передайте свой пароль "привет" этой функции и посмотрите, что она возвращает.

kmllev

Я вижу. Несмотря на то, что я ввел правильный пароль при попытке "войти", то есть "привет", возвращаемый хэш отличается после проверки $pass в password_hash (), поэтому успешный вход в систему, возможно, никогда не будет возможен. Как я могу это исправить? Или это должно быть на новом посту? Все, что я делаю, это получаю входные данные от пользователя, а затем извлекаю из базы данных соответствующий (хэшированный) пароль для этого имени пользователя, а затем использую password_verify, чтобы увидеть, совпадают ли они. Однако больше похоже на вопрос: почему hello хэшируется при проверке как переменная,но не при явном вводе?

Peter Leow

Существуют разные алгоритмы хэширования, чтобы хэш строки совпадал, они должны быть хэшированы с помощью одних и тех же алгоритмов, вам придется выяснить, какой алгоритм хэширования используется для хэширования тех паролей, которые хранятся в базе данных. Не забывая, что они также могут быть посолены поверх хеширования. Подробнее читайте: https://crackstation.net/hashing-security.htm