Я использовал следующие инструкции для установки почтового сервера:
http://www.geoffstratton.com/ubuntu-mail-server-postfix-dovecot-and-mysql
Сейчас я пытаюсь запрограммировать форму входа в PHP, но не знаю, как сравнить введенный пароль с сохраненным паролем.
Это mysql-код для шифрования пароля:
ENCRYPT('PASSWORD', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))
Я не понимаю, как это работает, потому что при каждом вызове этой функции генерируется совершенно новая строка.
Это то, что я до сих пор:
crypt($_POST[‘password’], '$6$'.substr(sha1(rand()), 0, 16))
Но, как я уже говорил, каждый раз получаю новую строку.
Используйте функции PHP password_hash
а также password_verify
,
Эти функции солят и повторяют для обеспечения безопасной защиты.
Смотрите руководство по PHP password_hash а также пароль проверить.
string password_hash ( string $password , integer $algo [, array $options ] )
Возвращает хешированный пароль или FALSE при ошибке.
boolean password_verify ( string $password , string $hash )
Возвращает TRUE, если пароль и хеш совпадают, или FALSE в противном случае.
Пример кода:
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
В вашем случае вы берете хэш пароля для этого имени пользователя из базы данных и храните его в переменной с именем $hash
, Тогда вы используете password_verify()
как это:
password_verify($_POST["password"], $hash)
Рассмотрим случай, когда пароль просто хранится как его хэш. Любой, кто читает данные, будет тяжело разобраться, что на самом деле представляет собой пароль, однако это не невозможно, ведь есть онлайновая база данных, содержащая огромное количество проиндексированных хэшей, и соответствующий открытый текст — можно просто найти хэш для обычно выбранных паролей. Далее рассмотрим случай, когда два пользователя имеют одинаковый хэш — это также означает, что любой, кто читает данные, будет знать, что у них один и тот же пароль.
Обе эти проблемы решаются в безопасной системе путем добавления случайной строки, известной как поваренная соль в открытый текст. Эта соль генерируется только один раз, а затем сохраняется вместе с паролем.
Таким образом, данные, которые вы сохранили, составляют $ 6 $ [соль] $ [хеш (соль + пароль)]
Чтобы проверить пароль, вы воссоздаете хеш, используя сохраненную соль и представленный пароль, и сравните его с сохраненным хешем. Функция crypt игнорирует любые данные после соли, поэтому вы просто делаете это:
if ($stored === crypt($_REQUEST['password'], $stored)) {
// Password is valid
Код, который вы используете, имеет очень низкую энтропию в своем производном соли — это, вероятно, подходит для большинства целей, но не в очень безопасных контекстах.