Атаки на PBKDF2 с малым числом итераций

PBKDF2 (Password-Based Key Derivation Function 2), реализованная в Stanford JavaScript Crypto Library (SJCL), предназначена для преобразования пароля в криптографически стойкий ключ. Основной механизм стойкости функции основан не на сложности самой математической операции, а на искусственном увеличении стоимости вычисления через параметр iterations — число повторений HMAC.

= (P, S, c, dkLen)

где:

    1. — пароль,
    1. — соль,
    1. — число итераций,
  • (dkLen) — длина выходного ключа.

При низком значении (c) вся модель безопасности PBKDF2 фактически перестаёт выполнять свою основную задачу — замедление перебора.


Роль итераций в стойкости PBKDF2

Каждая итерация PBKDF2 включает вычисление HMAC, а значит — криптографическую хеш-функцию. Увеличение числа итераций линейно увеличивает стоимость вычисления одного кандидата пароля.

T_{attack} N c t_{HMAC}

где:

    1. — количество проверяемых паролей,
    1. — число итераций,
  • (t_{HMAC}) — время одного HMAC.

При малых значениях (c) (например, 100–1000) современное оборудование позволяет выполнять миллиарды проверок в секунду, что делает оффлайн-атаки практически тривиальными.


Оффлайн-атаки при слабых параметрах

Основная опасность PBKDF2 с низким числом итераций проявляется в сценарии утечки хешей. Если злоумышленник получает базу вида:

username -> PBKDF2(password, salt, iterations)

он может выполнять перебор локально без ограничений по скорости запросов.

При слабом (c):

  • GPU ускоряют перебор до миллиардов HMAC-операций в секунду
  • ASIC-решения масштабируют вычисления ещё сильнее
  • CPU-кластеры позволяют распределять словарные атаки

В результате даже умеренно сложные пароли становятся уязвимыми.


Деградация стоимости атаки при малом числе итераций

PBKDF2 теряет защитные свойства из-за линейной зависимости стоимости от числа итераций.

C_{attack} =

где:

  • (C_{attack}) — количество проверок в секунду,
    1. — базовая производительность хеширования,
    1. — число итераций.

При увеличении (c) в 10 000 раз скорость атаки падает пропорционально. При (c) порядка сотен эффект защиты практически исчезает.


Типовые сценарии атак

Словарная атака

Используется заранее подготовленный список паролей. При малом числе итераций PBKDF2 не создаёт достаточной задержки, и перебор выполняется почти в реальном времени.

Особенность:

  • эффективность резко возрастает при наличии утекших паролей из других сервисов
  • часто комбинируется с масками (например, password2024, qwerty123)

Полный перебор

Если длина пароля мала, перебор выполняется полностью.

N = ||^L

где:

  • (||) — размер алфавита,
    1. — длина пароля.

PBKDF2 с малым (c) лишь незначительно увеличивает время каждого шага, не влияя на экспоненциальный характер роста пространства поиска.


Гибридные атаки

Комбинация словарных баз и перебора шаблонов:

  • база популярных паролей
  • добавление числовых суффиксов
  • замены символов (a -> @, o -> 0)

При низком (c) такие атаки становятся доминирующим методом взлома.


Почему SJCL не спасает низкое число итераций

SJCL предоставляет корректную реализацию PBKDF2, но не навязывает безопасные параметры. В результате разработчик может случайно задать:

sjcl.misc.pbkdf2(password, salt, 100);

Проблема здесь не в библиотеке, а в параметрах.

Критический момент:

  • безопасность PBKDF2 определяется не алгоритмом
  • а исключительно значением iterations

Современные вычислительные угрозы

Рост производительности GPU делает малые значения итераций особенно опасными:

  • тысячи CUDA-ядер параллельно выполняют HMAC
  • память почти не ограничивает вычисления PBKDF2
  • стоимость одной проверки падает до микросекунд

Это приводит к тому, что слабые параметры превращают PBKDF2 в почти эквивалент обычного хеша без замедления.


Практическое влияние на безопасность систем

Системы, использующие PBKDF2 с малым числом итераций, подвержены:

  • мгновенному взлому паролей из утечек
  • массовому компрометированию пользователей при одной утечке базы
  • невозможности компенсировать слабый пароль дополнительными мерами без увеличения (c)

Даже наличие соли не решает проблему скорости перебора — соль лишь устраняет предвычисленные радужные таблицы, но не влияет на стоимость каждой попытки.


Критическая зависимость от параметра c

PBKDF2 можно рассматривать как функцию, безопасность которой почти полностью определяется одной переменной.

S c

где (S) — стойкость к перебору.

При снижении (c) ниже определённого порога кривая безопасности резко обрывается: переход от «практически неприступно» к «взламывается за минуты» происходит без промежуточного устойчивого состояния.


Типичные ошибки реализации

В контексте SJCL наиболее распространены:

  • использование значений 100–1000 итераций
  • фиксация параметра без учёта роста вычислительных мощностей
  • отсутствие адаптивного выбора (c) под текущую систему
  • повторное использование старых конфигураций в новых проектах

Такие ошибки превращают PBKDF2 в формальную защиту без реальной криптостойкости.


Последствия слабых параметров в реальных системах

При компрометации базы данных:

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

PBKDF2 с малым числом итераций не замедляет злоумышленника в значимой степени, а значит не выполняет свою основную функцию — защиту от перебора.