Хэширование паролей, используя PHP 5.5 Password Hashing API.


Многие разработчики до сих пор используют старые и слабые алгоритмы для хэширования паролей, например, MD5 и SHA1. Некоторые разработчики при этом никогда не используют «соль». Новые возможности PHP 5.5 значительно облегчают работу с паролями. В этой статье будут рассмотрены некоторые основы данного API.

В PHP 5.5 появились три простые функции для работы с хэшами:

• password_hash() – используется, чтобы создать хэш для пароля
• password_verify() – используется для верификации пароля и имеющегося хэша
• password_get_info() – возвращает информацию об алгоритме, использованном при создании хэша и некоторые другие опции.

password_hash()

Хотя функция crypt() достаточно безопасна, она рассматривается многими как достаточно сложная и создает возможности для множества ошибок при разработке. Некоторые разработчики используют вместо этого «слабую соль» и слабый алгоритм для генерации хэша, например:

1
2
<?php
$hash = md5($password . $salt); // работает, но имеет уязвимости

Используя password_hash(), можно значительно упростить код. Достаточно лишь вызвать эту функцию, передав ее пароль, и она вернет хэш, который можно уже сохранять в базе данных.

1
2
<?php
$hash = password_hash($passwod, PASSWORD_DEFAULT);

И это все! Первый параметр – это пароль, для которого нужно создать хэш. Второй параметр – алгоритм для генерации хэша. Алгоритм по умолчанию на данный момент bcrypt, однако в будущем вместо него по умолчанию может быть добавлен более надежный алгоритм, генерирующий также более длинную строку. Сейчас – это 60 символов. Если вы планируете использовать алгоритм по умолчанию, то хорошим решением будет задать длину для пароля в колонке таблицы до 255 символов, ведь в будущем длина может измениться с изменением алгоритма. Либо же, передавайте напрямую PASSWORD_BCRYPT как второй параметр, тогда длина строки всегда будет 60 символов.

Важную вещь, которую нужно отметить: сейчас вам не нужно сохранять отдельно соль и хэш пароля. Данная функция возвращает соль как часть хэша и вам не нужно об этом беспокоиться. Также по умолчанию задается параметр «cost» для алгоритма, он равен 10, но вы можете передать в функцию свои значения:

1
2
3
4
5
6
7
<?php
$options = [
    'salt' => custom_function_for_salt(), //ваша функция для генерации соли
    'cost' => 12 // по умолчанию 10
];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);
password_verify()

Теперь, когда вы увидели, как можно создавать хэш для пароля, давайте посмотрим, как мы можем осуществить проверку соответствия пароля. Для этого достаточно воспользоваться функцией password_verify(). Функция принимает два параметра – пароль и хэш сохраненного пароля. Возвращает TRUE, если пароль верный, иначе FALSE:

1
2
3
4
5
6
7
8
<?php
if (password_verify($password, $hash)) {
    // пароль верный
} else {
    // пароль неверный
}
password_get_info()
password_get_info() принимает хэш и возвращает следующую информацию:

• algo – константа, которая идентифицирует алгоритм
• algoName – имя использованного алгоритма
• options – различные опции, которые были использованы при генерации пароля.

Заключение

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





Другие посты

Категория: PHP-скрипты

Оставить комментарий