Функция получения ключей HKDF
HKDF (HMAC-based Key Derivation Function) — это криптографическая функция получения ключей, построенная на основе HMAC (Hash-based Message Authentication Code). Она предназначена для преобразования исходного ключевого материала (например, общего секрета, полученного в результате протокола Диффи — Хеллмана) в один или несколько криптостойких ключей заданной длины, пригодных для использования в симметричных алгоритмах шифрования или аутентификации. HKDF стандартизирована в документе RFC 5869 (2010 год) и широко применяется в современных протоколах, включая TLS 1.3, IPsec, SSH, Signal и многие другие.
Принцип работы
HKDF состоит из двух независимых, но взаимосвязанных этапов: извлечения (extract) и расширения (expand). Такая двухэтапная архитектура позволяет отделить процесс удаления статистических зависимостей и неравномерностей из входного ключевого материала (этап извлечения) от процесса генерации необходимого количества ключевого материала заданной длины (этап расширения). В качестве базового примитива на обоих этапах используется HMAC с выбранной хеш-функцией (например, SHA-256, SHA-384 или SHA-512).
Этап извлечения (HKDF-Extract)
На вход этапа извлечения подаются:
- IKM (Input Keying Material) — исходный ключевой материал, который может быть неоднородным, иметь недостаточную энтропию или содержать предсказуемые паттерны.
- salt (соль) — необязательная, но рекомендуемая несекретная случайная строка. Соль повышает криптостойкость, предотвращая атаки по словарю и обеспечивая независимость получаемых ключей при использовании одного и того же IKM в разных контекстах. Если соль не задана, она принимается равной строке из нулевых байтов длиной, равной длине хеша.
Результатом этапа извлечения является псевдослучайный ключ PRK (Pseudo-Random Key) фиксированной длины, равной длине выхода хеш-функции (например, 32 байта для SHA-256). Вычисление PRK выполняется по формуле:
PRK = HMAC-Hash(salt, IKM)
где HMAC-Hash — функция HMAC, использующая хеш-функцию Hash.
Этап расширения (HKDF-Expand)
На вход этапа расширения подаются:
- PRK — псевдослучайный ключ, полученный на предыдущем этапе.
- info — необязательная контекстная информация (произвольная строка), позволяющая привязать генерируемые ключи к конкретному приложению, протоколу или сеансу связи.
- L — требуемая длина выходного ключевого материала в байтах.
Этап расширения генерирует последовательность блоков T(1), T(2), ..., T(n) до тех пор, пока их суммарная длина не превысит или не достигнет L. Каждый блок вычисляется рекурсивно:
T(0) = пустая строка (длина 0) T(i) = HMAC-Hash(PRK, T(i-1) || info || i)
где i — номер блока, представленный одним байтом (начиная с 1), а || обозначает конкатенацию. Выходной ключевой материал OKM (Output Keying Material) формируется как конкатенация первых L байтов последовательности T(1) || T(2) || ... || T(n).
Параметры и варианты
Выбор хеш-функции
HKDF может использовать любую криптографическую хеш-функцию, поддерживаемую HMAC. Наиболее распространённые варианты:
- HKDF-SHA256 — стандартный выбор для большинства современных приложений, обеспечивает хороший баланс между производительностью и безопасностью.
- HKDF-SHA384 — используется в системах, требующих повышенной стойкости (например, в некоторых реализациях TLS 1.3).
- HKDF-SHA512 — применяется в высокозащищённых системах или при необходимости получения ключей большой длины.
Использование соли
Хотя соль является необязательной, её использование настоятельно рекомендуется. Без соли (или при использовании нулевой соли) этап извлечения становится детерминированным: один и тот же IKM всегда даёт один и тот же PRK. Это может быть приемлемо в некоторых сценариях (например, когда IKM уже обладает высокой энтропией), но в общем случае снижает криптостойкость.
Комбинированный режим
В некоторых протоколах (например, в TLS 1.3) HKDF используется в комбинированном режиме, где этапы извлечения и расширения могут применяться многократно, образуя цепочки преобразований. Это позволяет, например, последовательно обновлять ключевой материал в рамках одного сеанса связи.
Применение
HKDF является фундаментальным строительным блоком во многих криптографических протоколах и системах:
Протокол TLS 1.3
В TLS 1.3 HKDF используется для генерации всех ключей сеанса: мастер-секрета, ключей шифрования, ключей аутентификации и векторов инициализации. Протокол явно определяет, как HKDF-Extract и HKDF-Expand применяются к общему секрету, полученному в результате обмена ключами (например, по протоколу Диффи — Хеллмана).
IPsec и IKEv2
В протоколах IPsec и IKEv2 HKDF применяется для получения ключей аутентификации и шифрования из общего секрета, установленного в ходе фазы 1 обмена ключами.
SSH (Secure Shell)
В протоколе SSH HKDF используется для генерации ключей сеанса после завершения обмена ключами Диффи — Хеллмана.
Signal Protocol
Протокол Signal, используемый в мессенджерах Signal, WhatsApp (продукт Meta, признанной экстремистской и запрещённой в РФ) и других, применяет HKDF для обновления ключей в рамках механизма «ratcheting» (храповика), обеспечивающего свойство прямой секретности (forward secrecy).
Системы управления ключами
HKDF применяется в различных системах управления ключами (KMS) для генерации производных ключей из мастер-ключа, используя контекстную информацию (info) для привязки к конкретному приложению или пользователю.
Свойства безопасности
HKDF обладает рядом криптографических свойств, делающих её предпочтительной функцией получения ключей:
- Псевдослучайность: выходной ключевой материал неотличим от случайной последовательности для любого противника, не знающего IKM и соль.
- Устойчивость к коллизиям: благодаря использованию HMAC, HKDF сохраняет стойкость к коллизиям базовой хеш-функции.
- Независимость ключей: ключи, полученные с разными значениями соли или info, являются статистически независимыми.
- Устойчивость к атакам по сторонним каналам: реализация HKDF на основе HMAC не требует секретных таблиц подстановок, что снижает риск утечки информации через кэш-память или время выполнения.
Критика и ограничения
Основным ограничением HKDF является её зависимость от криптостойкости базовой хеш-функции. В случае обнаружения коллизий или других атак на SHA-256 или SHA-512, безопасность HKDF может быть подорвана. Однако на момент 2025 года таких атак не существует.
Другим ограничением является то, что HKDF не предназначена для защиты от атак с перебором паролей (brute-force). Для таких задач используются специализированные функции, такие как bcrypt, scrypt или Argon2, которые включают механизмы замедления (work factor) и потребления памяти.
Сравнение с другими функциями
| Функция | Назначение | Особенности |
|---|---|---|
| HKDF | Получение ключей из IKM | Двухэтапная, на основе HMAC, высокая скорость |
| PBKDF2 | Защита паролей | Итеративное хеширование, медленнее HKDF |
| scrypt | Защита паролей | Требует много памяти, устойчива к ASIC |
| Argon2 | Защита паролей | Современный стандарт, настраиваемая память и время |
| KDF1/KDF2 | Получение ключей | Устаревшие, на основе хеш-функций без HMAC |
Источники
- RFC 5869 — HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
- Krawczyk, H. (2010). Cryptographic Extraction and Key Derivation: The HKDF Scheme. In: Advances in Cryptology — CRYPTO 2010
- NIST Special Publication 800-56C — Recommendation for Key-Derivation Methods in Key-Establishment Schemes
- Rescorla, E. (2018). The Transport Layer Security (TLS) Protocol Version 1.3. RFC 8446
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →