Если crypt()
генерирует разные строки каждый раз, как, черт возьми, я должен объединить предоставленный пароль и соль для одного и того же зашифрованного пароля в базе данных?
Я думал, что мог бы генерировать случайную соль для метода crypt (), чтобы объединить с предоставленным пользователем вводом (то есть crypt(@_POST['password'],$salt)
) для шифрования пароля. Это генерирует зашифрованный пароль для моей базы данных. Я также храню это $salt
в моей базе данных в пределах salt
колонка.
Я думал, что могу позвонить crypt($_POST['providedPassword'],$saltStoredInDatabaseFromRegistrationTime)
вернуть то же зашифрованное значение для пароля, который я сохранил в базе данных из формы регистрации, но оказывается, что crypt()
возвращает другое значение каждый раз, когда я его называю.
Как я могу получить такое же зашифрованное значение, которое у меня есть в моей базе данных для пароля?
Путь crypt()
работает так:
// to create
$hash = crypt($password, $salt);
// to verify
if (crypt($password, $hash) == $hash) {
// yay!
}
Не совсем так; crypt()
имеет множество алгоритмов хэширования и может возвращать недопустимые хэши для указания ошибок. Наконец, вы должны сравнивать хэши, используя функцию сравнения, которая не подвержена временным атакам, таким как новая hash_equals()
Замечания: Важно всегда генерировать новую соль каждый раз, когда вы что-то хэшируете crypt()
,
Тем не менее, начиная с PHP 5.5 вы должны хешировать пароли, используя password_hash()
а также password_verify()
; для более ранних версий вы можете использовать password_compat библиотека.
Других решений пока нет …