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 используется в двух режимах:
- HKDF-Extract: из общего секрета (например, результата обмена ключами по протоколу ECDHE) и соли (например, предыдущего ключа) извлекается PRK.
- 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 →