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

RFC 5869

RFC 5869 — это стандарт Интернета (Request for Comments), описывающий процедуру получения криптографических ключей на основе протокола HMAC (Hash-based Message Authentication Code). Опубликованный в мае 2010 года, документ определяет схему HKDF (HMAC-based Key Derivation Function), которая используется для преобразования исходного ключевого материала в один или несколько криптостойких ключей заданной длины. RFC 5869 разработан Хьюго Кравчиком (Hugo Krawczyk) и П. С. С. Эронсоном (P. S. S. Aronson) и является частью семейства стандартов, связанных с безопасностью протоколов передачи данных.

История и контекст

Необходимость в стандартизированной функции выработки ключей возникла в связи с развитием криптографических протоколов, таких как TLS, IPsec, SSH и других. До появления RFC 5869 использовались различные нестандартизированные методы, что приводило к несовместимости и потенциальным уязвимостям. Работа над HKDF началась в середине 2000-х годов, и её основой послужили исследования в области криптографических хеш-функций и HMAC. RFC 5869 был принят как информационный документ, но его рекомендации широко применяются в современных системах безопасности.

Основные принципы HKDF

HKDF (HMAC-based Key Derivation Function) — это криптографическая функция, которая принимает на вход исходный ключевой материал (IKM, Input Key Material) и выдаёт один или несколько производных ключей (OKM, Output Key Material). Процесс состоит из двух этапов: извлечения (extract) и расширения (expand).

Этап извлечения (Extract)

На этом этапе из исходного ключевого материала, который может быть неоднородным, неслучайным или иметь низкую энтропию, извлекается псевдослучайный ключ (PRK, Pseudorandom Key). Для этого используется HMAC с заданной хеш-функцией (например, SHA-256). Входными данными являются:

  • IKM — исходный ключевой материал (может быть произвольной длины).
  • salt — необязательная, но рекомендуемая случайная строка, которая повышает стойкость к атакам по словарю и предотвращает коллизии.

Формула: PRK = HMAC-Hash(salt, IKM). Если salt не указан, он заменяется строкой нулей длиной, равной длине хеша.

Этап расширения (Expand)

На этом этапе из полученного PRK генерируется необходимое количество выходных ключей заданной длины. Процесс итеративный: каждый последующий блок вычисляется на основе предыдущего. Входными данными являются:

  • PRK — псевдослучайный ключ, полученный на этапе извлечения.
  • info — необязательная контекстная информация (например, идентификатор протокола или сессии), которая позволяет привязывать ключи к конкретному применению.
  • L — требуемая длина выходного ключа (в битах).

Формула: T(0) = пустая строка, T(i) = HMAC-Hash(PRK, T(i-1) || info || i), где i — номер блока (начиная с 1). Выходной ключ формируется как конкатенация блоков T(1) || T(2) || ... || T(n) до достижения длины L.

Параметры и хеш-функции

RFC 5869 не привязывает HKDF к конкретной хеш-функции, но рекомендует использовать криптостойкие хеш-функции, такие как SHA-256, SHA-384 или SHA-512. Выбор хеш-функции влияет на длину PRK и выходных ключей, а также на производительность. В документе также обсуждаются вопросы безопасности, связанные с выбором параметров, включая длину salt и количество итераций.

Применение

HKDF широко используется в различных протоколах и системах:

Протокол TLS 1.3

В версии 1.3 протокола TLS (Transport Layer Security) HKDF является основным механизмом для выработки сессионных ключей. Он используется для генерации ключей шифрования, аутентификации и других криптографических параметров на этапе рукопожатия. В TLS 1.3 HKDF применяется как для извлечения, так и для расширения, причём используются различные контекстные метки (info) для разных целей.

IPsec (Internet Protocol Security)

В IPsec HKDF применяется для выработки ключей в протоколах IKEv2 (Internet Key Exchange) и ESP (Encapsulating Security Payload). Он обеспечивает криптостойкость ключей, используемых для шифрования и аутентификации IP-пакетов.

SSH (Secure Shell)

В протоколе SSH HKDF используется для генерации ключей после завершения обмена ключами (key exchange). Это позволяет получать ключи для шифрования, аутентификации и целостности данных.

Другие применения

HKDF также применяется в криптографических библиотеках, таких как OpenSSL, Bouncy Castle, и в системах управления ключами, например, в стандарте NIST SP 800-56C (Recommendation for Key Derivation through Extraction-then-Expansion). Он используется в блокчейн-технологиях, в частности, в протоколах Bitcoin и Ethereum для генерации ключей из seed-фраз.

Безопасность

HKDF считается криптографически стойкой функцией при правильном выборе параметров. Основные аспекты безопасности включают:

  • Стойкость к атакам по словарю: использование salt снижает эффективность атак, основанных на предварительно вычисленных таблицах (rainbow tables).
  • Устойчивость к коллизиям: HMAC, лежащий в основе HKDF, устойчив к коллизиям хеш-функций.
  • Стойкость к атакам на основе связанных ключей: HKDF не позволяет злоумышленнику, знающему один производный ключ, получить другие ключи или исходный IKM.
  • Независимость выходных ключей: при использовании разных значений info или salt выходные ключи статистически независимы.

Однако, если исходный ключевой материал имеет низкую энтропию (например, пароль), HKDF может быть уязвим к атакам перебора. В таких случаях рекомендуется использовать функции увеличения стойкости (key stretching), такие как PBKDF2 или bcrypt, до применения HKDF.

Критика и ограничения

Несмотря на широкое применение, HKDF имеет некоторые ограничения:

  • Отсутствие встроенного механизма увеличения стойкости: HKDF не предназначен для обработки паролей с низкой энтропией; для этого требуются дополнительные меры.
  • Зависимость от HMAC: безопасность HKDF полностью зависит от стойкости используемой хеш-функции и HMAC. При компрометации хеш-функции HKDF становится небезопасным.
  • Сложность реализации: неправильная реализация (например, игнорирование salt или использование неверной длины) может привести к уязвимостям.

Примеры использования

Пример 1: Генерация ключа для AES-256

  • IKM: 256-битный случайный seed.
  • salt: 128-битная случайная строка.
  • info: строка "AES-256-Encryption-Key".
  • L: 256 бит.
  • Хеш-функция: SHA-256.
  • Результат: 256-битный ключ для AES-256.

Пример 2: Выработка нескольких ключей в TLS 1.3

В TLS 1.3 HKDF используется для получения нескольких ключей из одного общего секрета (pre-master secret). Для каждого ключа используется своя метка info, например, "key expansion", "client write key", "server write key" и т.д.

Связанные стандарты

  • RFC 2104: HMAC: Keyed-Hashing for Message Authentication.
  • RFC 6234: US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF).
  • NIST SP 800-56C: Recommendation for Key Derivation through Extraction-then-Expansion.
  • RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3.

Источники

  • RFC 5869: HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
  • RFC 2104: HMAC: Keyed-Hashing for Message Authentication
  • RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
  • NIST SP 800-56C: Recommendation for Key Derivation through Extraction-then-Expansion
  • H. Krawczyk, "Cryptographic Extraction and Key Derivation: The HKDF Scheme", 2010
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru