KDF (Key Derivation Function) — это функция, преобразующая исходный секрет (чаще всего пароль) в криптографически стойкий ключ фиксированной длины. Основная задача таких функций заключается в том, чтобы сделать использование слабых или предсказуемых паролей устойчивым к перебору и криптоанализу.
В контексте криптографических библиотек на JavaScript, таких как Stanford JavaScript Crypto Library (SJCL), KDF является фундаментальным механизмом для безопасного хранения и использования паролей, генерации ключей шифрования и защиты данных в условиях потенциально небезопасной среды исполнения (браузер, клиентское приложение).
Пароли, используемые пользователями, почти всегда обладают низкой энтропией. Это означает, что количество возможных комбинаций существенно ограничено по сравнению с криптографическими ключами.
Ключевая проблема:
Без дополнительной обработки пароль напрямую не подходит для криптографических операций.
При отсутствии функции растяжения пароля (password stretching) возможны следующие типы атак:
Каждый вариант пароля проверяется напрямую. Если пароль короткий или простой, он быстро подбирается.
Используются заранее подготовленные списки популярных паролей и их вариаций.
Используются предвычисленные хэши для обратного поиска паролей без соли.
Соль — это случайное значение, добавляемое к паролю перед хэшированием.
Основные свойства соли:
Однако соль не увеличивает вычислительную стоимость атаки. Она лишь устраняет возможность предвычисления.
Растяжение пароля — это процесс многократного или ресурсоёмкого преобразования пароля с целью увеличения времени, необходимого для одной проверки.
Основная идея:
увеличить стоимость одной попытки подбора пароля
Даже если пароль слабый, его проверка становится вычислительно дорогой.
KDF выполняет три ключевые задачи:
В Stanford JavaScript Crypto Library используется PBKDF2 (Password-Based Key Derivation Function 2), описанная в RFC 2898.
PBKDF2 основана на применении хэш-функции (в SJCL чаще всего HMAC-SHA256) многократно.
= (P, S, c, dkLen)
где:
c
Количество итераций напрямую влияет на устойчивость системы.
Каждая итерация:
Практическое значение:
В SJCL используется реализация PBKDF2 через HMAC-SHA256.
Типичный процесс:
Функционально это выглядит как:
Однократное применение хэш-функции:
PBKDF2 и аналогичные KDF решают эту проблему за счёт:
Ключевые параметры, влияющие на стойкость:
Современные атакующие используют параллельные вычисления:
KDF компенсирует это следующим образом:
PBKDF2 относится к классу CPU-bound функций. Это означает:
Современные альтернативы:
SJCL исторически использует PBKDF2 как базовый и широко совместимый вариант.
В экосистеме SJCL KDF применяется в нескольких сценариях:
Типовая схема:
Пароль → PBKDF2 → ключ → шифрование данных
K = (P, S)_K(M)
где:
Таким образом, KDF является промежуточным слоем между человеческим паролем и криптографическим алгоритмом.
Типичные ошибки:
Любая из этих ошибок снижает безопасность системы до уровня, пригодного для массового перебора.
Растяжение пароля компенсирует фундаментальный дисбаланс:
KDF превращает слабый ввод в сильный криптографический материал за счёт вычислительной стоимости, делая атаку экономически невыгодной при корректных параметрах.