Статьи

Почему вы должны использовать Bcrypt для хеширования сохраненных паролей

Было обнаружено, что 79% участников недавнего опроса ZoneAlarm используют рискованные пароли. Данные были использованы для представления очень стильной инфографики, показывающей, насколько широко распространено использование плохих паролей. Но независимо от того, насколько сложно угадать хорошие пароли, их может быть не сложнее взломать, чем плохие, в зависимости от того, как хранится пароль.

Еще в 2006 году Reddit подтвердил, что копия их базы данных была украдена. Больше всего беспокоил тот факт, что все пароли пользователей были сохранены в базе данных Reddit без какой-либо маскировки ! Многие пользователи были в панике, потому что они использовали тот же пароль для Reddit и на многих других сайтах. Это было серьезное нарушение безопасности, которое привело к серьезной проблеме для многих несчастных членов Reddit. Удивительно, что некоторые веб-разработчики все еще считают, что хранение паролей в виде простого текста без шифрования или хеширования — это хороший способ сохранить пароль.

Сейчас 2011 год, и хотя большинство разработчиков согласны с тем, что запутывание сохраненных паролей является обязательной функцией безопасности для любого веб-сайта, управляемого пользователями, используемые методы отстают. Некоторые считают, что MD5 — это безопасный способ кодирования паролей; это ложь (тоже очень плохая)! MD5 — хороший способ скрыть нечувствительные данные, но его очень легко «декодировать» с помощью радужных таблиц . Однажды я услышал историю о веб-разработчике, который не мог получить доступ к базе данных клиента после того, как клиент удалил электронное письмо, в котором были указаны его пароли. Разработчик, после просмотра файлов клиента на их сервере, нашел красиво отформатированный текстовый файл, содержащий хэш пароля MD5. Это была просто быстрая процедура копирования и вставки в онлайн-утилиту поиска радужных таблиц до того, как они были зарегистрированы в базе данных клиента. У этой истории счастливый конец, так как пароль клиента был восстановлен, и разработка могла продолжаться, но шокирующая правда в том, что этот процесс мог быть легко осуществлен руками злоумышленника.

BCrypt

Так что же является хорошим вариантом для безопасного хеширования паролей? Одним из выдающихся вариантов в PHP является Bcrypt. Bcrypt — это адаптивная хеш-функция, основанная на криптографическом алгоритме симметричного блочного шифра Blowfish. Он использует ключевой фактор (или рабочий фактор), который регулирует стоимость хеширования, что, вероятно, является наиболее заметной функцией Bcrypt. Возможность увеличить стоимость (время и вычислительную мощность) хэширования в будущем, когда компьютеры станут более мощными, — это то, что действительно отличает Bcrypt от других функций.

Bcrypt может расширить так называемый ключевой фактор, чтобы компенсировать все более мощные компьютеры и эффективно «замедлять» скорость хэширования. Изменение ключевого фактора также влияет на результат хэширования, так что это делает Bcrypt чрезвычайно устойчивым к атакам на основе радужных таблиц. Более новые компьютеры могут пытаться угадать исходный ввод хеша, но все равно потребуется столько же времени (или дольше), чтобы проверить, соответствует ли его предположение или нет. Все это делает Bcrypt почти будущим!

Bcrypt невероятно медленен для ввода хеша по сравнению с другими функциями, но это приводит к гораздо лучшему выходному хешу. Когда дело доходит до хеширования и шифрования, скорость никогда не бывает лучше. Чем дольше требуется что-то кодировать, тем больше времени требуется компьютеру, чтобы попытаться определить входные данные. Как пишет Томас Птачек в своей статье « Достаточно с таблицами радуги» : «Чем лучше вы можете оптимизировать хеш-функцию пароля, тем быстрее становится ваша хеш-функция пароля, тем слабее ваша схема». В случае Bcrypt это очень медленно. Подумайте об этой цитате из статьи Коды Хейл Как безопасно хранить пароль :

Насколько медленнее bcrypt, чем, скажем, MD5? Зависит от фактора работы. Используя коэффициент работы 12, bcrypt хэширует пароль yaaa примерно за 0.3 секунды на моем ноутбуке. MD5, с другой стороны, занимает меньше микросекунды.

Не думайте, что Bcrypt звучит так, как будто это будет слишком медленно. Как я упоминал ранее, вы можете установить, насколько велика стоимость хэширования. Это означает, что вы можете пойти на полную безопасность, но жертвовать временем, используя огромный ключевой фактор, или вы можете использовать минимальный ключевой фактор и сократить время, необходимое для хеширования входного значения. В любом случае, именно эта функция делает шифрование Bcrypt настолько безопасным, что вы не сможете проиграть ни с одним из этих вариантов. Это все зависит от вас.

Чтобы оценить возможности Bcrypt, давайте сравним их с подходящим алгоритмом хеширования, таким как SHA-2. SHA-2 не использует никаких криптографических алгоритмов, но вместо этого использует алгоритм хеширования для генерации его выходных данных (хотя алгоритмы как SHA-2, так и Blowfish могут выдерживать очень похожий уровень проверки). Bcrypt намного медленнее, чем SHA-2, и, следовательно, теоретически лучше. SHA-2 также не адаптивен, как Bcrypt и его ключевой фактор, поэтому он будет более восприимчивым к атакам на основе таблиц по мере увеличения вычислительной мощности компьютера. SHA-2 на данный момент является полностью способной функцией хэширования, но Bcrypt выигрывает, потому что это скорость (с хэшированием, чем медленнее, тем лучше) и адаптивность.

Использование Bcrypt в PHP

Вы можете подумать: «Боже, все эти функции кажутся очень сложными… Стоит ли тратить время на то, чтобы изменить мою стратегию хеширования паролей для использования Bcrypt?» Ответ ДА! Bcrypt прост в использовании и будет полезен в долгосрочной перспективе.

Bcrypt доступен вам уже, если вы используете PHP версии 5.3, просто используя функцию crypt() с солью, необходимой Blowfish. Он может быть доступен в более ранних версиях, если ваша система поддерживает их, но я рекомендую 5.3, потому что PHP содержит собственную реализацию алгоритма, что исключает любые дополнительные зависимости).

Вы можете проверить, будет ли Bcrypt работать на вашем сервере, проверив, определена ли константа CRYPT_BLOWFISH и соответствует ли она 1:

 <?php if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { echo "CRYPT_BLOWFISH is enabled!"; } else { echo "CRYPT_BLOWFISH is not available"; } 

После этого вам нужно всего лишь использовать код, подобный следующему, для хэширования ваших паролей перед их сохранением:

 <?php $salt = '$2a$07$R.gJb2U2N.FmZ4hPp1y2CN$'; crypt("secretpassword", $salt); 

Соль должна начинаться с $2a$ за которым следует двузначный ключевой фактор и еще один знак доллара, а затем содержать 22 буквенно-цифровых символа (также допускается точка и косая черта). Руководство по PHP объясняет ограничения для соли:

[…] Следующим образом: «$ 2a $», двухзначный параметр стоимости «$» и 22 цифры алфавита «./0-9A-Za-z». Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины. Двузначный параметр стоимости — это логарифм base-2 числа итераций для базового алгоритма хеширования на основе Blowfish, и он должен находиться в диапазоне 04-31, значения вне этого диапазона вызовут ошибку crypt ().

Резюме

PHP позволяет разработчикам максимально легко использовать Bcrypt, поэтому возникает вопрос, почему вы его не используете? Если вы используете версию ниже 5.3, я умоляю вас обновить установку PHP. Важность использования безопасной функции хеширования, такой как Bcrypt, должна быть жизненно важной для любого, кто создает веб-приложение, которое будет хранить пароли пользователей и другие конфиденциальные данные.

Помимо легкости, я рекомендую вам использовать Bcrypt, потому что он будет соответствовать закону Мура . Я знаю, что уже освещал это ранее, но я чувствую необходимость подчеркнуть, насколько важен этот факт. Если вы начнете использовать Bcrypt сейчас, вы можете быть уверены, что пароли всех ваших пользователей хешируются с помощью функции, которая не будет устаревать в течение ночи. Ключом к этому является возможность настраивать скорость работы или ключевой фактор, как я упоминал ранее.

Итак, у вас есть моя личная рекомендация, почему вы должны использовать Bcrypt для хеширования паролей и других конфиденциальных данных. Вот список сайтов и статей, которые вы можете прочитать, если хотите больше узнать о Bcrypt или Blowfish:

Изображение через Валерий Потапова / Shutterstock