Открыть сервис

Функция получения ключей 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

Источники

  1. RFC 5869 — HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
  2. Krawczyk, H. (2010). Cryptographic Extraction and Key Derivation: The HKDF Scheme. In: Advances in Cryptology — CRYPTO 2010
  3. NIST Special Publication 800-56C — Recommendation for Key-Derivation Methods in Key-Establishment Schemes
  4. Rescorla, E. (2018). The Transport Layer Security (TLS) Protocol Version 1.3. RFC 8446

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →