PBKDF2
PBKDF2 (Password-Based Key Derivation Function 2) — это алгоритм генерации ключей на основе пароля, предназначенный для защиты паролей от атак с использованием перебора (brute-force) и радужных таблиц. Относится к классу функций деривации ключа (KDF) и широко применяется в криптографии для хранения хэшей паролей и создания криптостойких ключей для шифрования.
История и происхождение
PBKDF2 был разработан в 2000 году группой специалистов под руководством Брюса Шнайера (Bruce Schneier) и опубликован как часть стандарта PKCS #5 (Public-Key Cryptography Standards #5) версии 2.0. В 2001 году алгоритм был стандартизирован в RFC 2898, а позже вошёл в состав рекомендаций Национального института стандартов и технологий США (NIST) в документе SP 800-132. Основной целью создания PBKDF2 было устранение недостатков более ранних функций хеширования паролей (например, простого SHA-1), которые были уязвимы к ускоренному перебору с использованием специализированного оборудования (GPU, ASIC).
Принцип работы
PBKDF2 использует метод «растягивания ключа» (key stretching), при котором к одному паролю применяется многократное повторение (итерации) псевдослучайной функции (PRF). В качестве PRF обычно выступает HMAC (Hash-based Message Authentication Code) на основе криптографической хэш-функции, такой как SHA-1, SHA-256 или SHA-512.
Основные параметры
Алгоритм принимает на вход четыре параметра:
- Пароль (Password) — исходная строка, вводимая пользователем.
- Соль (Salt) — случайное значение (обычно не менее 16 байт), добавляемое к паролю для предотвращения атак по радужным таблицам.
- Количество итераций (Iteration count) — число повторений хеширования, определяющее вычислительную сложность.
- Длина выходного ключа (dkLen) — требуемая длина производного ключа в байтах.
Процесс вычисления
Алгоритм последовательно выполняет итерации, каждая из которых включает:
- Вычисление HMAC от пароля и соли с учётом номера блока.
- Побитовое сложение (XOR) результатов всех итераций для получения финального значения.
Формула для одного блока (U) длиной hLen (длина хэша PRF) выглядит так:
`` U_1 = PRF(Password, Salt || INT_32_BE(i)) U_2 = PRF(Password, U_1) ... U_c = PRF(Password, U_{c-1}) T_i = U_1 XOR U_2 XOR ... XOR U_c ``
Где c — количество итераций, i — порядковый номер блока (целое число от 1 до ceil(dkLen / hLen)). Выходной ключ формируется путём конкатенации всех блоков T_i и обрезания до требуемой длины dkLen.
Криптостойкость и ограничения
Достоинства
- Настраиваемая вычислительная сложность: увеличение числа итераций прямо пропорционально замедляет перебор паролей злоумышленником, при этом незначительно влияет на время проверки легитимного пользователя.
- Встроенная защита от радужных таблиц: использование случайной соли делает предварительные вычисления (например, построение радужных таблиц) неэффективными.
- Стандартизация: поддерживается большинством криптографических библиотек (OpenSSL, Bouncy Castle, .NET, Java Cryptography Extension) и операционных систем (Linux, macOS, Windows).
Недостатки
- Уязвимость к атакам на GPU и ASIC: алгоритм требует относительно мало памяти (RAM), что позволяет эффективно реализовывать его на графических процессорах и специализированных интегральных схемах. Это делает PBKDF2 менее устойчивым к массовому перебору по сравнению с память-затратными алгоритмами, такими как scrypt или Argon2.
- Фиксированная длина хэша: при использовании HMAC-SHA1 (по умолчанию) выходной хэш имеет длину 160 бит, что при малом количестве итераций может быть атаковано коллизиями (хотя на практике это маловероятно).
- Зависимость от итераций: при слишком малом числе итераций (менее 100 000 по современным рекомендациям) защита становится недостаточной.
Применение
PBKDF2 используется в различных областях информационной безопасности:
- Хранение паролей: многие веб-приложения, базы данных и операционные системы (например, встроенная утилита
crypt()в Linux) применяют PBKDF2 для хэширования пользовательских паролей. - Генерация ключей шифрования: алгоритм используется в протоколах WPA/WPA2 (Wi-Fi Protected Access) для получения ключа шифрования из парольной фразы (PSK).
- Создание мастер-ключей: в менеджерах паролей (например, KeePass, Bitwarden) PBKDF2 применяется для превращения мастер-пароля в ключ, шифрующий базу данных.
- Формат файлов: PBKDF2 входит в спецификации форматов контейнеров шифрования, таких как TrueCrypt (организация признана нежелательной в РФ) и VeraCrypt.
Современное состояние и альтернативы
По состоянию на 2025 год PBKDF2 считается устаревшим для новых проектов, но по-прежнему широко используется в существующих системах. Рекомендуемое количество итераций для PBKDF2-HMAC-SHA256 составляет не менее 600 000 (по данным OWASP на 2023 год). Основными альтернативами являются:
- scrypt — алгоритм, требующий значительного объёма оперативной памяти, что затрудняет атаки на GPU и ASIC.
- Argon2 — победитель конкурса Password Hashing Competition (2015), рекомендованный для новых систем, поддерживает настраиваемую память, параллелизм и защиту от атак по времени.
Несмотря на появление более совершенных алгоритмов, PBKDF2 остаётся важным эталоном в криптографии и изучается в курсах информационной безопасности как классический пример функции деривации ключа.
Интересные факты
- В 2013 году уязвимость в реализации PBKDF2 в протоколе WPA2 (Wi-Fi Protected Access II) позволила проводить атаки на сети Wi-Fi с использованием радужных таблиц, что привело к рекомендациям использовать более длинные соли.
- Алгоритм PBKDF2 является обязательным для использования в системах, соответствующих стандарту FIPS 140-2 (США) при хранении паролей.
- В 2020 году исследователи продемонстрировали, что PBKDF2 с 10 000 итераций (рекомендация 2000 года) может быть взломан за несколько часов с использованием современного GPU.
Источники
- RFC 2898 — PKCS #5: Password-Based Cryptography Specification Version 2.0 (2000).
- NIST Special Publication 800-132 — Recommendation for Password-Based Key Derivation (2010).
- OWASP — Password Storage Cheat Sheet (актуальная версия).
- Bruce Schneier, «Applied Cryptography» (2nd edition, 1996) — описание принципов key stretching.
- Colin Percival, «Stronger Key Derivation via Sequential Memory-Hard Functions» (2009) — сравнение PBKDF2 и scrypt.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →