Хэширование паролей, используя 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-скрипты