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

HKDF

HKDF (англ. HMAC-based Key Derivation Function — функция формирования ключа на основе HMAC) — это криптографическая функция формирования ключей, основанная на использовании HMAC (Hash-based Message Authentication Code). HKDF разработана для преобразования исходного ключевого материала (например, пароля, общего секрета, полученного в ходе протокола Диффи — Хеллмана, или энтропии) в один или несколько криптостойких ключей заданной длины, пригодных для использования в симметричном шифровании, аутентификации или других криптографических целях. HKDF стандартизирована в документе RFC 5869 (2010 год) и является одной из наиболее распространённых и рекомендуемых функций формирования ключей в современной криптографии.

История и стандартизация

HKDF была предложена криптографом Хьюго Кравчиком (Hugo Krawczyk) в 2010 году в рамках рабочей группы IETF. Разработка функции была мотивирована необходимостью создания простого, но безопасного и универсального метода получения ключей из неидеального исходного материала. В отличие от более ранних функций, таких как PBKDF2 (Password-Based Key Derivation Function 2), HKDF не ориентирована на защиту от перебора паролей, а предназначена для случаев, когда исходный материал уже обладает достаточной энтропией, но требует дополнительной обработки.

RFC 5869 (HMAC-based Extract-and-Expand Key Derivation Function) официально описывает HKDF как двухэтапный процесс: извлечение (extract) и расширение (expand). Стандарт был принят и включён в рекомендации многих криптографических библиотек и протоколов, включая TLS 1.3, IPsec, SSH и другие. В Российской Федерации HKDF не входит в перечень стандартизированных криптографических алгоритмов (ГОСТ), однако её использование допускается в коммерческих и исследовательских целях при условии соответствия требованиям законодательства о криптографии.

Принцип работы

HKDF состоит из двух независимых этапов: извлечение (extract) и расширение (expand). В некоторых сценариях (например, когда исходный материал уже равномерно распределён и имеет достаточную длину) этап извлечения может быть опущен, и функция используется только в режиме расширения.

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

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

PRK = HMAC-Hash(salt, IKM)

Здесь salt — это необязательная, но рекомендуемая соль (случайная или известная строка), которая добавляется для повышения стойкости к атакам по словарям и для обеспечения уникальности выходного ключа даже при одинаковом IKM. Если соль не задана, она устанавливается в строку нулевой длины. Длина PRK равна длине выходного хеша используемой HMAC (например, 32 байта для SHA-256).

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

На втором этапе из PRK генерируется требуемое количество выходных ключевых битов (OKM, Output Keying Material) произвольной длины. Для этого используется итеративное применение HMAC с контекстной информацией. Формула этапа расширения:

T(0) = пустая строка T(1) = HMAC-Hash(PRK, T(0) || info || 0x01) T(2) = HMAC-Hash(PRK, T(1) || info || 0x02) ... OKM = T(1) || T(2) || ... || T(n)

Здесь info — это необязательная контекстная строка (например, идентификатор приложения или цели использования ключа), а 0x01, 0x02 и т.д. — однобайтовые счётчики итераций. Общая длина OKM не должна превышать 255 × L, где L — длина выходного хеша (в байтах). Для SHA-256 максимальная длина OKM составляет 8160 байт.

Криптографические свойства

HKDF обладает рядом свойств, делающих её предпочтительной для многих приложений:

  • Стойкость к атакам: функция устойчива к коллизиям и атакам на основе выбранного открытого текста, поскольку базируется на HMAC, который сам по себе криптостойкий.
  • Универсальность: HKDF может работать с любым исходным материалом, имеющим достаточную энтропию, и генерировать ключи любой длины.
  • Модульность: разделение на этапы извлечения и расширения позволяет использовать функцию в различных сценариях, включая случаи, когда извлечение не требуется.
  • Простота реализации: функция требует только поддержки HMAC и хеш-функции, что делает её легко реализуемой на любом языке программирования.

Применение

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

  • Протокол TLS 1.3: HKDF используется для формирования ключей сессии из общего секрета, полученного в ходе обмена ключами (например, на основе эллиптических кривых). В TLS 1.3 HKDF применяется как для извлечения, так и для расширения, с использованием контекстной информации для каждого этапа.
  • IPsec: в протоколе IKEv2 HKDF применяется для генерации ключей аутентификации и шифрования.
  • SSH: в протоколе Secure Shell HKDF используется для получения ключей сессии.
  • Системы управления ключами: HKDF применяется в библиотеках типа OpenSSL, Bouncy Castle и других для безопасного получения ключей из паролей или других источников энтропии.
  • Криптовалюты: в некоторых блокчейн-проектах (например, в протоколах на основе BIP-32) HKDF используется для генерации дочерних ключей.

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

В протоколе TLS 1.3 HKDF используется в двух режимах:

  1. HKDF-Extract: из общего секрета (например, результата обмена ключами по протоколу ECDHE) и соли (например, предыдущего ключа) извлекается PRK.
  2. HKDF-Expand: из PRK с использованием контекстной информации (например, меток «tls13 key schedule») генерируются ключи для шифрования, аутентификации и другие.

Сравнение с другими функциями

HKDF часто сравнивают с PBKDF2, bcrypt, scrypt и Argon2. Основные отличия:

  • PBKDF2: также основана на HMAC, но ориентирована на защиту от перебора паролей (итерации). HKDF не предполагает большого числа итераций, так как работает с уже энтропийным материалом.
  • bcrypt и scrypt: специализированные функции для хеширования паролей, использующие память для усложнения атак. HKDF не требует значительных ресурсов памяти.
  • Argon2: современная функция для хеширования паролей, победитель конкурса PHC. HKDF не предназначена для защиты от перебора, а для формирования ключей из высокоэнтропийного материала.

Таким образом, HKDF не заменяет функции для защиты паролей, а дополняет их в сценариях, где исходный материал уже обладает достаточной энтропией (например, общий секрет в криптографических протоколах).

Интересные факты

  • HKDF была разработана как часть более широкой работы по криптографическим протоколам, и её название является аббревиатурой от «HMAC-based Key Derivation Function».
  • В RFC 5869 авторы приводят формальные доказательства безопасности HKDF в модели случайного оракула, что делает её одной из немногих функций формирования ключей с математически обоснованной стойкостью.
  • HKDF поддерживает использование произвольной длины выходного материала, что позволяет генерировать ключи для различных целей (например, для шифрования и аутентификации) из одного исходного материала.

Источники

  • RFC 5869 — HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
  • Krawczyk, H. (2010). Cryptographic Extraction and Key Derivation: The HKDF Scheme. Proceedings of the 30th Annual Conference on Advances in Cryptology (CRYPTO 2010).
  • Стандарты TLS 1.3 (RFC 8446) — использование HKDF в протоколе
  • Документация OpenSSL 3.0 — раздел HKDF
  • NIST Special Publication 800-56C — рекомендации по формированию ключей (упоминание HKDF)

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

На главную BFOmetr →