Стойкое хеширование в PHP на примере bcrypt

Комментарии ()

Стойкость паролей, который захешированы с помощью md5/SHA-1 оченень ненадежна. Для решения  пробемы безопасности, необходимо использовть "соль" и более стойкие алгоритмы хеширования, которые значительно увеличивают надёжность.

Функция bcrypt использует алгоритм, который работает настолько медленно, что рассчёт радужных таблиц и атаки методом перебора стали абсолютно неэффективными.  Для необратимого шифрования она использует алгоритм blowfish с множеством итераций, и работает очень медленно. Путём изменения количества итераций можно регулировать время, затрачиваемое на шифрования пароля, и найти такую «золотую середину», когда шифрование одного пароля будет достаточно быстрым, а подбор его станет бессмысленным.

В PHP есть встроенная функция crypt(), которая являюется реализацией адаптивной криптографической хеш-функции bcrypt. С версиях PHP 5.3 и выше функция crypt() имеет встроенную реализацию алгоритмов шифрования и больше не зависит от поддержки этих алгоритмов ОС. Она поддерживает различные алгоритмы (от DES до SHA-512) и выбирает алгоритм в зависимости от того, какая соль задаётся в качестве её параметра.

Ниже пример генератора соли. Будучи скормленной функции crypt() данная соль заставит её использовать blowfish с 10 в квадрате итерациями. Это задаётся идентификатором $2a$ (использовать bcrypt), и идущим затем количеством итераций, которые задаются как логарифм по основанию 2 (в данном случае это 210, то есть 1024 итераций). Увеличение параметра на единицу удваивает количество итераций, и следовательно время рассчёта функции.

// Генерируем соль
$salt = '$2a$10$'.substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(),mt_rand()))), 0, 22) . '$';
// Шифруем пароль с применением данной соли
$hashed_password = crypt($password, $salt);

 


Webit.in.ua 2013