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 хеширования входят четыре функции:

  1. password_hash() - хэширование строки
  2. password_verify() - сравнение строки и зашифрованной строки
  3. password_needs_rehash() - проверка, использует ли хеширование те или иные параметры
  4. 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 — всякие опции