На данный момент использование bcrypt - это лучший способ хэширования паролей, однако множество разработчиков по старинке используют MD5 и SHA1. Многие из них, не применяют технику добавления соли. В PHP 5.5 решили акцентировать внимание разработчиков на алгоритме bcrypt и создали специальный хэш API.
Хэш API состоит из следующих функций:
password_hash() – для генерации хэша пароля.
password_verify() – проверка пароля.
password_needs_rehash() – используется когда нужно перегенерировать хэш.
password_get_info() – возвращает название алгоритма и другую информацию.
password_hash()
Использование функции crypt() у многих вызывает ступор из-за сложности, поэтому вместо неё применяются упрощённые способы создания хэша. К примеру:
$hash = md5($password . $salt);
Функция password_hash() упрощает этот процесс настолько, насколько это возможно. Если вам нужно создать хэш пароля, вызовите эту функцию и запишите значение в базу данных.
$hash = password_hash($passwod, PASSWORD_DEFAULT);
Вот и всё! Первый параметр - это строка представляющая собой пароль; второй - алгоритм, который будет применён.
Алгоритм, который используется по умолчанию - bcrypt, но в будущем будут добавлены и другие, более продвинутые алгоритмы. Если вы используете PASSWORD_DEFAULT, то знайте, что на выходе получите строку из более 60 символов. Она может быть и больше, особенно, при использовании других алгоритмов, так что в таблице размер поля можете выставить 255. В качестве второго параметра, вы можете использовать константу PASSWORD_BCRYPT. В этом случае, размер строки на выходе будет ровно 60 символов.
Важно понять, что вам самим не нужно передавать соль или параметр cost (стоимость - количество раундов подготовки ключей). Новый API сделает это за вас. Но если же вы хотите сами задать данные параметры, то можете сделать это следующим образом.
$options = [
'salt' => custom_function_for_salt(), //напишите свою функцию генерации соли
'cost' => 12 // по умолчанию равен 10
];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);
Вот и всё!
password_verify()
Теперь, когда вы знаете как генерировать хэш, давайте посмотрим на то, как осуществлять проверку.
Функция password_verify() принимает пароль в обычном виде и его хэш. В зависимости от результатов проверки, возвращает true или false.
if (password_verify($password, $hash)) {
// Успех!
}
else {
// Провал
}
Заметьте, что соль находится в самом хэше, так что нам не нужно указывать её вручную.
password_needs_rehash()
Что если вам необходимо обновить параметры соли или стоимости? Или изменились настройки хэширования PHP? В этом случае, можете воспользоваться функцией password_needs_rehash() для проверки данного факта.
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
// необходимо создать хэш пароля ещё раз
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
}
Данную операцию можно делать при входе пользователя в систему, ведь только тогда у нас есть доступ к паролю в явном виде.
password_get_info()
password_get_info() возвращает параметры хэширования:
algo – константа с названием алгоритма
algoName – название алгоритма
options – различные настройки
Заключение
Новый API для хэширования паролей очень прост. Это отличная замена функции crypt(). Если вам на сервере доступна версия PHP 5.5, то мы рекомендуем воспользоваться данным API.