Пример API функций хеширования паролей PHP — сегодняшняя тема. Новый API хеш-функций в PHP 5.5 обеспечивает поддержку bcrypt , скрывая при этом его сложность. Вы должны хешировать пароли пользователей с помощью функции bcrypt () , но все же удивительное количество разработчиков использует небезопасные md5 () или sha1 () (посмотрите на недавние утечки паролей).
Функции хеширования паролей PHP
Вы хэшируете свои пароли пользователей? В противном случае вы напрашиваетесь на проблемы. Хранение паролей в виде простого текста или использование старых, более слабых алгоритмов, таких как MD5
или SHA1
для хранения паролей, стало устаревшей практикой и менее безопасным, чем новые современные методы. Например, с выпуском PHP 5.5 вы можете использовать api хеширования паролей.
Добавляя новый, очень простой в использовании API, PHP надеется подтолкнуть больше разработчиков к bcrypt. Он имеет четыре простые функции:
- password_get_info — возвращает информацию о заданном хэше.
- password_hash — создает хэш пароля.
- password_needs_rehash — проверяет, соответствует заданным параметрам.
- password_verify — проверяет, соответствует ли пароль хешу.
password_hash () в PHP
Когда вам нужно хешировать пароль, передайте строку пароля функции, и она вернет хеш, который вы можете сохранить в своей базе данных.
См. следующий код.
php//app.php $ pwd = 'Starboy'; $ hashpwd = password_hash ($ pwd, PASSWORD_BCRYPT); echo $ hashpwd;
Здесь, в функции password_hash (), мы передали два параметра.
- PASSWORD_BCRYPT
По умолчанию алгоритм в настоящее время — bcrypt, но более сильный алгоритм может быть добавлен по умолчанию позже, в любой момент в будущем может генерироваться строка большего размера.
Если вы используете PASSWORD_DEFAULT в своих проектах, обязательно сохраните хэш в столбце, длина которого превышает 60 символов. Поэтому установите типы данных SQL в соответствии с ним.
Установка размера столбца на 255 может быть хорошим выбором. Вы можете использовать PASSWORD_BCRYPT в качестве второго параметра. В этом случае вывод всегда будет содержать 60 символов.
Смотрите результат.
➜ pro php app.php $ 2y $ 10 $ YkCr7mbJ6Fh8osXvbes/rud4ZfykHWWFUH.h2BK.HMY5FXi1R9Hby ➜ pro
Давайте использовать ПАРОЛЬ /strong> в качестве второго параметра.
php//app.php $ pwd = 'Starboy'; $ hashpwd = password_hash ($ pwd, PASSWORD_DEFAULT); echo $ hashpwd;
См. результат.
➜ pro php app.php $ 2y $ 10 $ 2dl7qSkh4zExF6xeR5eE. uhFM4Ym3dvKv00oRCx/fGlVQR9ny1FkS ➜ pro
Это создаст хэш пароля с использованием алгоритма по умолчанию (в настоящее время bcrypt), коэффициента загрузки по умолчанию (теперь 10) и автоматически созданной соли.
Используемый алгоритм и соль также будут частью результирующего хэша, поэтому вам не нужно о них беспокоиться.
Здесь важно то, что вам не нужно указывать значение соли или параметр стоимости. Обо всем этом позаботится новый API хеширования.
Соль является частью хэша, поэтому вам не нужно сохранять ее отдельно.
Если вы хотите указать свою соль (или стоимость), вы можете сделать это, передав третий аргумент функции, массив параметров.
Проверка хешированного пароля с помощью password_verify ()
Помните, что вы сохраняете хеши в базе данных, но это простой пароль, который вы получаете, когда пользователь входит в систему.
Функция password_verify () принимает в качестве двух аргументов простой пароль и хешированную строку. Он возвращает значение true , если хэш соответствует указанному паролю.
Проверка паролей также проста. См. Следующий код.
Php//$ пароль от пользователя, $ hash из базы данныхif (password_verify ($ password, $ hash)) {//пароль действительный!} Else {//неверно пароль :(}
Просто помните, что соль является частью хешированного пароля, поэтому мы не указываем его здесь отдельно.
Повторное хеширование Pwd с использованием password_needs_rehash
В будущем вы можете захотеть изменить алгоритм хеширования пароля или коэффициент загрузки, или PHP может изменить настройки по умолчанию, чтобы сделать алгоритм более безопасным.
В этом случае новые учетные записи должны быть сгенерированы с использованием последних параметров, а существующие пароли должны быть повторно хешированы при входе в систему (вы можете сделать это только при входе в систему, потому что вам нужен исходный пароль для выполнения повторного хеширования).
password_needs_rehash (строка $ hash, int $ algorithm [, array $ options]): bool
hash
Хэш, созданный
Константа алгоритма пароля , обозначающая алгоритм, используемый при хешировании пароля.
options
Ассоциативный массив, содержащий все параметры. См. Константы алгоритма пароля для документации по поддерживаемым параметрам для каждого алгоритма.
Функция password_needs_rehash () проверяет, реализует ли предоставленный хеш алгоритм и предоставленные варианты. Если нет, то предполагается, что хеш нужно перехешировать.
См. Код.
phpif (password_needs_rehash ($ hash, PASSWORD_DEFAULT, ['cost' => 12])) {//пароль необходимо повторно хешировать, поскольку он не был сгенерирован с//текущим значением по умолчанию алгоритм или не создан с//параметром стоимости 12 $ hash = password_hash ($ password, PASSWORD_DEFAULT, ['cost' => 12]); //не забудьте сохранить новый хеш!}
Получить информацию о хешированном пароле PHP
password_get_info () возвращает информацию о заданном хэше. Он принимает хэш и возвращает ассоциативный массив из трех элементов.
- algo : константа, определяющая конкретный алгоритм.
- algoName: название используемого алгоритма.
- options: различные параметры, используемые при генерации хэша .
См. следующий синтаксис.
password_get_info (string $ hash)
$ hash создается алгоритмом, поддерживаемым password_hash (). Функция password_hash () вернет массив информации об этом хэше.
См. Следующий код.
Php //app.php $ pwd = 'Starboy'; $ hashpwd = password_hash ($ pwd, PASSWORD_DEFAULT, ['cost' => 11]); echo 'Хеш пароля:', $ hashpwd; print_r (password_get_info ($ hashpwd ));
См. вывод.
➜ pro php app.php Хеш пароля: $ 2y $ 11 $ Xxv04ESL.Q.30wE9n6I9.OFJh.KiH9/HNN2LeUOf0QRot6s /4HqliArray ([algo] => 1 [algoName] => bcrypt [options] => Array ([cost] => 11)) ➜ pro
Совместимость со старыми версиями PHP Версии
Новый API хеширования будет представлен только в версии PHP 5.5. Те, кто в настоящее время использует PHP 5.3.7 (или более старую версию), могут использовать библиотеку с именем password_compat, которая имитирует этот API и автоматически отключается после обновления версии PHP до 5.5.
Наконец, PHP Пример API функций хеширования паролей завершен.