2015-05-04 4 views
-1

Из моего понимания до сих пор (по крайней мере, я думаю) функция password_hash() генерирует хэш на основе используемого алгоритма, стоимости и соли. Хотя password_verify использует информацию, предоставленную, например, password_hash($pass, PASSWORD_BCRYPT, array('cost'=>10)), чтобы проверить, является ли возвращаемое значение истинным или ложным, поскольку оно содержит всю информацию, необходимую для проверки.Сравнение паролей с сохраненным хешем

я ранее использовал

$SQL_Query = "SELECT * FROM DB_Table WHERE userName = '".$username."'" AND password = $ID;

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

я наткнулся на подобные вопросы, когда они используют статические пароли в объяснениях, таких как

<?php 

$to_verify = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $to_verify)) 
{ 
    echo 'Password is valid!'; 

} else 
{ 
    echo 'Wrong password.'; 
} 

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

+0

Вы должны запросить хэш, выбрав пользователя. Когда у вас есть хэш, вы можете сравнить с опубликованным паролем, [тестирование для истины, как вы это сделали выше) (http://jayblanchard.net/proper_password_hashing_with_PHP.html). –

+0

у вас есть синтаксическая ошибка 'userName = '". $ Username. "'" '<= Прямо там.* ", который будет работать" * Я в этом сомневаюсь. Вторичной двойной цитаты не должно быть. Скажите, что это опечатка. –

+0

@ Dagon Возможный дубликат многих. Слишком много вопросов и ответов для заполнения этого вопроса. –

ответ

0

хэш генерируется случайным образом каждый раз, когда

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

Концепция У меня возникли проблемы с пониманием того, как можно было бы проверить ввод пароля на хешированное значение, если оно хранится в базе данных, а не известно, что страница была на тот момент?

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

+1

Хэш всегда отличается для данного входа, если вы позволяете PHP каждый раз предоставлять случайную соль. –

+0

Да, вам нужно хранить соль для данного пользователя. –

+1

* «Да, вам нужно хранить соль для данного пользователя» * - почему бы просто не позволить функции позаботиться об этом? –

1

Посмотрите примеры для password_hash() и password_verify()вместе.

Хэш-строка, созданная password_hash, является самоописательной: она содержит указание как алгоритма, так и используемой случайной соли. password_verify знает обо всем этом. Он знает, как «делать правильные вещи» для паролей как недавних, так и винтажных.

Поэтому просто запросите базу данных, чтобы получить (hashed ...) пароль для этого пользователя. Затем используйте password_verify(), чтобы узнать, соответствует ли это значение хэша этому паролю.

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

Смежные вопросы