PHP API хеширования паролей. Password Hashing API
Мы часто используем хеширование для того, чтобы скрыть пароли пользователей от глаз хакеров.
Есть быстрые и надежные функции хэширования такие как md5() или sha1(). Проблема этих функций в их быстроте потому, что данные, которые они зашифровали можно также быстро и подобрать.
Есть функции более надежные такие как crypt() или password_hash(). Такие функции поддерживают функционал хэширования, которые установленные в вашей ОС или используют функционал хэширования встроенный в PHP если функции шифрования забыли поставить на ОС.
crypt() - позволяет использовать соль (salt. дополнительная строка, которую вы указываете и которая, позволяет усложнить расшифровку пароля методом подбора). Если не использовать соль - crypt() сделает слабый пароль, а с версией PHP 5.6 выдаст сообщение E_NOTICE. Первым параметром функция принимает строку, которую нужно зашифровать, вторым параметром - строку salt.
password_hash() - является надстройкой над crypt(). Эта функция сама может создать соль и применяет правильно количество раундов хэширования автоматически. Первым параметром функция принимает строку, которую нужно зашифровать, вторым параметром константы PASSWORD_DEFAULT - строка будет больше 60 символов или PASSWORD_BCRYPT - строка будет 60 символов. Третьим необязательным параметром функция принимает массив с настройками
$options = [
'salt' => getMySalt(), // ваша функция возвращающая соль
'cost' => 12 // Время работы полезно для усложнения подобра пароля. По умолчанию 10
];
Использование PHP API.
В API хеширования входят четыре функции:
- password_hash() - хэширование строки
- password_verify() - сравнение строки и зашифрованной строки
- password_needs_rehash() - проверка, использует ли хеширование те или иные параметры
- password_get_info() - возвращает параметры хеширования
Если вы использовали crypt() для проверки пароля - это выглядело примерно так:
$password = '123456'; $hash = crypt($password); if (crypt($password, $hash) == $hash) { echo "Ok"; }
используя функцию password_hash() шифрование и проверка пароля может выглядеть так:
$password = '123456'; $hash = password_hash($password); if (password_verify($password, $hash)) { echo "Ok"; }
password_needs_rehash() проверяет использует ли функционал хэширования конкретный алгоритм, соль и стоимость
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { }
password_get_info() - информация о механизме хеширования. Возвращается массив с такими параметрами:
- algo — используемый алгоритм
- algoName — название используемого алгоритма
- options — всякие опции
Комментарии
Комментарии отсутствуют, Вы можете быть первым