Хранение паролей — не место для импровизаций. Эта статья объяснит, чем отличаются два популярных алгоритма, почему важно правильно настраивать параметры и какие практические шаги помогают снизить риск компрометации учетных записей.

Зачем вообще хешировать пароли

Прямое хранение паролей в базе данных — очевидная уязвимость. Если база утечет, злоумышленник получает чистые строки для входа; хеширование превращает пароли в значения, которые нельзя напрямую превратить обратно.

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

Коротко о принципах, которые работают

Надежный подход сочетает соль, адаптивную стоимость и сопротивление аппаратному ускорению. Соль уникальна для каждой записи и предотвращает использование радужных таблиц, адаптивная стоимость замедляет проверку паролей для любого потенциального атакующего.

Также важна память как ресурс: если алгоритм требует много оперативной памяти, его сложнее ускорить на GPU и ASIC. Это одна из причин популярности новых схем семейства Argon2.

Что такое bcrypt

bcrypt появился в конце 1990-х как развитие идеи Blowfish и быстро стал эталоном для серверных приложений. Он использует соль, детерминированный cost-параметр и внутренний цикл формирования хеша, что делает перебор дорогим по времени.

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

Как работает bcrypt

При создании хеша bcrypt генерирует уникальную соль и применяет многократные раунды шифрования с этой солью и паролем. В результате получается строка, включающая версию, cost и соль, что упрощает верификацию.

Cost-параметр управляет числом итераций и экспоненциально влияет на время вычисления. Рост cost даёт выигрыш в безопасности, но увеличивает нагрузку на аутентификацию пользователей.

Ограничения bcrypt

bcrypt не проектировался с учётом памяти как ключевого ресурса, поэтому современные GPU и специализированные устройства могут ускорять его взлом сильнее, чем алгоритмы, использующие много оперативной памяти. Кроме того, длина входного пароля может обрезаться в некоторых реализациях.

Несмотря на это, для множества приложений bcrypt остаётся разумным выбором, если правильно настроить cost и использовать дополнительные меры защиты, такие как защита от перебора по IP и лимиты запросов.

Что такое Argon2

Argon2 — победитель конкурса по выбору хеш-функции паролей, проводившегося в 2015 году. Он спроектирован с учётом памяти, параллелизма и гибкости параметров для противостояния современным аппаратным атакам.

Алгоритм позволяет управлять временем вычисления, объёмом используемой памяти и уровнем параллелизма, что делает его более адаптируемым к требованиям безопасности и инфраструктуры.

Варианты Argon2

Семейство включает Argon2d, Argon2i и Argon2id. Argon2d оптимизирован для защиты от атак на аппаратном уровне, Argon2i лучше против атак с использованием каналов побочных данных, а Argon2id сочетает свойства обоих и часто рекомендован для общего применения.

Выбор варианта зависит от особенностей применения: там, где возможны атаки с побочными каналами, предпочтителен Argon2i или Argon2id; для защиты от массового GPU-взлома важны параметры памяти и параллелизма.

Параметры Argon2 и их влияние

Три главных параметра — memory (память), time (время) и parallelism (число параллельных блоков). Увеличение памяти существенно повышает стоимость атаки для GPU и ASIC, а увеличение времени делает каждую проверку дольше, что полезно для замедления перебора.

Параллелизм позволяет оптимально загружать многоядерные серверы при хешировании, но также учитывает, что атакующие могут использовать параллелизм для ускорения своих расчётов. Балансировка этих параметров — ключ к практическому использованию.

Сравнение возможностей

Характеристика bcrypt Argon2
Год появления 1999 2015
Память как фактор Низкая Высокая, настраиваемая
Параллелизм Ограничен Поддерживается явно
Устойчивость к GPU Средняя Высокая при правильных параметрах
Рекомендация для новых систем Подходящ для совместимости Предпочтителен

Таблица показывает основные различия, но выбор не сводится к простому сравнению строк. Оцените требования своего приложения: совместимость, требования к латентности, возможности инфраструктуры и ожидания по сроку поддержки.

Если вы запускаете новый проект с возможностью контролировать серверную среду, Argon2 часто оказывается более гибким и безопасным. Для унаследованных систем с ограничениями в библиотеках bcrypt может быть практичнее.

Рекомендации по настройке и эксплуатации

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

Храните хеши в формате, включающем используемый алгоритм и параметры. Это облегчает аудит и миграцию, когда придёт время переходить на более требовательные конфигурации.

  • Всегда генерируйте уникальную соль для каждой учётной записи.
  • Выбирайте параметры по результатам нагрузочного теста на вашей инфраструктуре.
  • Храните метаданные о версии алгоритма рядом с хешем.
  • Ограничивайте число попыток входа и используйте задержки или backoff.
  • Рассмотрите использование pepper — секретного значения на сервере, при этом тщательно защищая его.

Переход от bcrypt к Argon2: практический план

Массовая миграция всех хешей одновременно редко возможна; безопаснее и проще делать миграцию по мере логинов пользователей. Такой поштучный подход снижает риски и распределяет нагрузку на систему.

  1. Внедрите поддержку нового алгоритма в кодовую базу, оставив совместимость с существующими bcrypt-хешами.
  2. При успешном логине пользователя: проверить старый bcrypt-хеш, затем пересоздать хеш с Argon2 и обновить запись в базе.
  3. Добавьте флаг или метку версии хеша, чтобы отличать старые и новые записи.
  4. Проведите нагрузочное тестирование, чтобы понять влияние параметров Argon2 на производительность аутентификации.

Такая стратегия минимизирует вмешательство в работу сервиса и позволяет безопасно и постепенно повысить общий уровень защиты. Важно заранее планировать откаты и мониторинг ошибок аутентификации.

Опыт из практики

В одном из проектов мне пришлось мигрировать десятки тысяч аккаунтов: тестовый прогон показал, что выбранный memory-параметр Argon2 увеличивал время логина на 30 миллисекунд — это было приемлемо. Мы выбрали конфигурацию, при которой нагрузка оставалась в лимитах, а устойчивость к GPU-атакам существенно выросла.

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

Практическая сводка: что делать прямо сейчас

Если вы строите новый сервис, начинайте с Argon2id и подберите параметры через замеры на вашей платформе. Для унаследованных систем используйте bcrypt с увеличенным cost и планируйте постепенный переход.

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

Выбор между bcrypt и Argon2 — не только вопрос теории, это баланс между безопасностью и реальными ограничениями инфраструктуры. Тщательно протестируйте опции, документируйте решения и обновляйте параметры по мере роста вычислительных возможностей.