Использование bcrypt является общепринятой практикой для хеширования паролей, но большое количество разработчиков по-прежнему используют более старые и более слабые алгоритмы, такие как MD5 и SHA1. Некоторые разработчики даже не используют соль при хешировании. Новый API хеширования в PHP 5.5 призван привлечь внимание к bcrypt, скрывая его сложность. В этой статье я расскажу об основах использования нового API хэширования PHP.
Новый API хеширования паролей предоставляет четыре простых функции:
-
password_hash()
-
password_verify()
-
password_needs_rehash()
-
password_get_info()
password_hash ()
Хотя функция crypt()
Некоторые разработчики затем используют слабую соль и слабый алгоритм для генерации хеша, например:
<?php
$hash = md5($password . $salt); // works, but dangerous
Но функция password_hash()
Когда вам нужно хешировать пароль, просто передайте его функции, и он вернет хеш, который вы можете сохранить в своей базе данных.
<?php
$hash = password_hash($password, PASSWORD_DEFAULT);
Это оно! Первый параметр — это строка пароля, которую необходимо хэшировать, а второй параметр указывает алгоритм, который следует использовать для генерации хэша.
Алгоритм по умолчанию в настоящее время bcrypt, но более сильный алгоритм может быть добавлен в качестве значения по умолчанию позже в какой-то момент в будущем и может генерировать большую строку. Если вы используете PASSWORD_DEFAULT
Установка размера столбца 255 может быть хорошим выбором. Вы также можете использовать PASSWORD_BCRYPT
В этом случае результат всегда будет длиной 60 символов.
Здесь важно то, что вам не нужно указывать солт-значение или параметр стоимости. Новый API позаботится обо всем этом для вас. И соль является частью хэша, поэтому вам не нужно хранить ее отдельно. Если вы хотите указать свою собственную соль (или стоимость), вы можете сделать это, передав в функцию третий аргумент — массив опций.
<?php
$options = [
'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt
'cost' => 12 // the default cost is 10
];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);
Таким образом, вы всегда в курсе новых мер безопасности. Если позже PHP решит реализовать более мощный алгоритм хеширования, ваш код может воспользоваться этим.
password_verify ()
Теперь, когда вы увидели, как генерировать хэши с помощью нового API, давайте посмотрим, как проверить пароль. Помните, что вы храните хеши в базе данных, но это простой пароль, который вы получаете, когда пользователь входит в систему.
Функция password_verify()
Возвращает true, если хеш соответствует указанному паролю.
<?php
if (password_verify($password, $hash)) {
// Success!
}
else {
// Invalid credentials
}
Просто помните, что соль является частью хешированного пароля, поэтому мы не указываем его отдельно здесь.
password_needs_rehash ()
Что если вам нужно изменить параметры соли и стоимости для хеш-строк? Это вызывает беспокойство, так как вы можете решить повысить безопасность, добавив более солидную или более высокую стоимость. Кроме того, PHP может изменить стандартную реализацию алгоритма хеширования. Во всех этих случаях вы хотели бы перефразировать существующие пароли.
password_needs_rehash ()
помогает проверить, реализует ли указанный хэш определенный алгоритм и использует ли он при создании определенные параметры, такие как стоимость и соль.
<?php
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
// the password needs to be rehashed as it was not generated with
// the current default algorithm or not created with the cost
// parameter 12
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// don't forget to store the new hash!
}
Имейте в виду, что вам нужно будет сделать это, когда пользователь попытается войти на ваш сайт, поскольку у вас есть только доступ к простому паролю.
password_get_info ()
password_get_info()
-
algo
-
algoName
-
options
Вывод
С новым API хэширования паролей работать определенно проще, чем с функцией crypt()
Если ваш сайт в настоящее время работает на PHP 5.5, тогда я настоятельно рекомендую вам использовать новый API хеширования. Те, кто использует PHP 5.3.7 (или более позднюю версию), могут использовать библиотеку password_compat, которая эмулирует API и автоматически отключает себя после обновления версии PHP до 5.5.