PBKDF2 (Password-Based Key Derivation Function 2), реализованная в Stanford JavaScript Crypto Library (SJCL), предназначена для преобразования пароля в криптографически стойкий ключ. Основной механизм стойкости функции основан не на сложности самой математической операции, а на искусственном увеличении стоимости вычисления через параметр iterations — число повторений HMAC.
= (P, S, c, dkLen)
где:
При низком значении (c) вся модель безопасности PBKDF2 фактически перестаёт выполнять свою основную задачу — замедление перебора.
Каждая итерация PBKDF2 включает вычисление HMAC, а значит — криптографическую хеш-функцию. Увеличение числа итераций линейно увеличивает стоимость вычисления одного кандидата пароля.
T_{attack} N c t_{HMAC}
где:
При малых значениях (c) (например, 100–1000) современное оборудование позволяет выполнять миллиарды проверок в секунду, что делает оффлайн-атаки практически тривиальными.
Основная опасность PBKDF2 с низким числом итераций проявляется в сценарии утечки хешей. Если злоумышленник получает базу вида:
username -> PBKDF2(password, salt, iterations)
он может выполнять перебор локально без ограничений по скорости запросов.
При слабом (c):
В результате даже умеренно сложные пароли становятся уязвимыми.
PBKDF2 теряет защитные свойства из-за линейной зависимости стоимости от числа итераций.
C_{attack} =
где:
При увеличении (c) в 10 000 раз скорость атаки падает пропорционально. При (c) порядка сотен эффект защиты практически исчезает.
Используется заранее подготовленный список паролей. При малом числе итераций PBKDF2 не создаёт достаточной задержки, и перебор выполняется почти в реальном времени.
Особенность:
password2024,
qwerty123)Если длина пароля мала, перебор выполняется полностью.
N = ||^L
где:
PBKDF2 с малым (c) лишь незначительно увеличивает время каждого шага, не влияя на экспоненциальный характер роста пространства поиска.
Комбинация словарных баз и перебора шаблонов:
a -> @,
o -> 0)При низком (c) такие атаки становятся доминирующим методом взлома.
SJCL предоставляет корректную реализацию PBKDF2, но не навязывает безопасные параметры. В результате разработчик может случайно задать:
sjcl.misc.pbkdf2(password, salt, 100);
Проблема здесь не в библиотеке, а в параметрах.
Критический момент:
iterationsРост производительности GPU делает малые значения итераций особенно опасными:
Это приводит к тому, что слабые параметры превращают PBKDF2 в почти эквивалент обычного хеша без замедления.
Системы, использующие PBKDF2 с малым числом итераций, подвержены:
Даже наличие соли не решает проблему скорости перебора — соль лишь устраняет предвычисленные радужные таблицы, но не влияет на стоимость каждой попытки.
PBKDF2 можно рассматривать как функцию, безопасность которой почти полностью определяется одной переменной.
S c
где (S) — стойкость к перебору.
При снижении (c) ниже определённого порога кривая безопасности резко обрывается: переход от «практически неприступно» к «взламывается за минуты» происходит без промежуточного устойчивого состояния.
В контексте SJCL наиболее распространены:
Такие ошибки превращают PBKDF2 в формальную защиту без реальной криптостойкости.
При компрометации базы данных:
PBKDF2 с малым числом итераций не замедляет злоумышленника в значимой степени, а значит не выполняет свою основную функцию — защиту от перебора.