PBKDF2 — это функция формирования ключа на основе пароля, в которой
ключ получается через многократное применение хэш-функции к паролю и
соли. В Web Crypto API реализация выполняется через
SubtleCrypto.deriveKey или deriveBits, где
число итераций напрямую влияет на стойкость и производительность.
Число итераций определяет, сколько раз хэш-функция будет применена к входным данным. Каждый дополнительный цикл увеличивает вычислительную стоимость подбора пароля, но одновременно увеличивает время легитимного получения ключа.
K = PBKDF2(P, S, c, dkLen)
где:
Рост значения c линейно увеличивает стоимость вычислений как для атакующего, так и для легитимного пользователя.
Исторически применялись значения:
В контексте современных CPU и GPU такие значения считаются недостаточными. Массово применяются параллельные атаки, а специализированное оборудование (GPU/ASIC) позволяет перебор даже при 100 000 итераций.
Практическая рекомендация зависит от цели системы:
Для систем, где важно сохранить приемлемую задержку входа:
Ключевой критерий — время вычисления на сервере:
Для хранения критичных данных:
При этом необходимо учитывать нагрузку при пиковом количестве пользователей.
Для устройств с ограниченными ресурсами:
В Web Crypto API PBKDF2 обычно используется с:
H = SHA256(input)
SHA-256 обеспечивает баланс между скоростью и криптографической стойкостью, поэтому чаще всего используется как базовая функция.
Правильный подход заключается не в фиксированном числе, а в измерении времени вычисления.
Алгоритм подбора:
Примерный ориентир:
Эти значения сильно зависят от устройства и реализации браузера.
Типичная реализация:
const encoder = new TextEncoder();
const keyMaterial = await crypto.subtle.importKey(
"raw",
encoder.encode(password),
"PBKDF2",
false,
["deriveKey"]
);
const key = await crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt: saltBuffer,
iterations: 600000,
hash: "SHA-256"
},
keyMaterial,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
Параметр iterations является центральным элементом
безопасности всей схемы.
Фиксированное значение становится менее актуальным в реальных системах. Более устойчивый подход — адаптация под среду:
В некоторых системах применяется диапазон:
PBKDF2 является CPU-bound функцией, что ограничивает эффективность GPU-ускорения, но не исключает его полностью. Современные атаки используют:
Поэтому увеличение числа итераций остаётся основным способом повышения стойкости.
На практике встречаются критические ошибки:
Такие подходы приводят к уязвимостям при оффлайн-подборе паролей.
Основная проблема PBKDF2 — конфликт между:
Решение заключается в выборе порога, при котором пользователь не ощущает задержку, но атака становится экономически невыгодной.
Практически значимым считается диапазон, при котором:
При проектировании систем хранения паролей:
PBKDF2 остаётся совместимым стандартом Web Crypto API, но его безопасность полностью определяется корректным выбором числа итераций и своевременной адаптацией этого параметра под текущий уровень вычислительных возможностей атакующей стороны.