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

PBKDF2 — это функция формирования ключа на основе пароля, в которой ключ получается через многократное применение хэш-функции к паролю и соли. В Web Crypto API реализация выполняется через SubtleCrypto.deriveKey или deriveBits, где число итераций напрямую влияет на стойкость и производительность.

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

K = PBKDF2(P, S, c, dkLen)

где:

  • P — пароль
  • S — соль
  • c — число итераций
  • dkLen — длина производного ключа

Рост значения c линейно увеличивает стоимость вычислений как для атакующего, так и для легитимного пользователя.

Минимальные и устаревшие значения

Исторически применялись значения:

  • 1 000 – 10 000 — ранние веб-системы
  • 10 000 – 100 000 — переходный период
  • 100 000+ — современные базовые рекомендации прошлого десятилетия

В контексте современных CPU и GPU такие значения считаются недостаточными. Массово применяются параллельные атаки, а специализированное оборудование (GPU/ASIC) позволяет перебор даже при 100 000 итераций.

Современные ориентиры числа итераций

Практическая рекомендация зависит от цели системы:

Интерактивные приложения (вход пользователя)

Для систем, где важно сохранить приемлемую задержку входа:

  • 200 000 – 600 000 итераций при SHA-256
  • до 1 000 000 при высокой допустимой задержке

Ключевой критерий — время вычисления на сервере:

  • целевое время: 100–500 мс на одну операцию

Системы с повышенной безопасностью

Для хранения критичных данных:

  • 600 000 – 3 000 000 итераций
  • допустима задержка до 1–2 секунд

При этом необходимо учитывать нагрузку при пиковом количестве пользователей.

Мобильные устройства и слабое железо

Для устройств с ограниченными ресурсами:

  • 100 000 – 300 000 итераций
  • адаптивный подход обязателен

Выбор хэш-функции

В Web Crypto API PBKDF2 обычно используется с:

  • SHA-1 (устаревший, не рекомендуется)
  • SHA-256 (де-факто стандарт)
  • SHA-384 / SHA-512 (для повышенной стойкости)

H = SHA256(input)

SHA-256 обеспечивает баланс между скоростью и криптографической стойкостью, поэтому чаще всего используется как базовая функция.

Практика измерения безопасного числа итераций

Правильный подход заключается не в фиксированном числе, а в измерении времени вычисления.

Алгоритм подбора:

  1. выбирается целевое время T (например, 250 мс)
  2. подбирается число итераций c
  3. измеряется фактическое время вычисления
  4. значение корректируется под целевую задержку

Примерный ориентир:

  • CPU среднего уровня: 100 000 итераций ≈ 20–80 мс 500 000 итераций ≈ 150–400 мс

Эти значения сильно зависят от устройства и реализации браузера.

Web Crypto API и PBKDF2

Типичная реализация:

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-ускорения, но не исключает его полностью. Современные атаки используют:

  • массовый параллелизм
  • распределённые вычисления
  • оптимизированные реализации SHA

Поэтому увеличение числа итераций остаётся основным способом повышения стойкости.

Ошибки при выборе числа итераций

На практике встречаются критические ошибки:

  • фиксированное низкое значение (например, 10 000)
  • игнорирование роста вычислительной мощности
  • отсутствие измерений времени выполнения
  • одинаковые параметры для сервера и клиента

Такие подходы приводят к уязвимостям при оффлайн-подборе паролей.

Баланс между безопасностью и UX

Основная проблема PBKDF2 — конфликт между:

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

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

Практически значимым считается диапазон, при котором:

  • одна попытка занимает сотни миллисекунд
  • массовый перебор становится затратным по времени

Долгосрочные рекомендации

При проектировании систем хранения паролей:

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

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