HKDF - HKDF

HKDF это простой ключевая деривационная функция (KDF) на основе аутентификация сообщений на основе хэша[1] код (HMAC).[2] Первоначально он был предложен его авторами в качестве строительного блока в различных протоколах и приложениях, а также для предотвращения распространения множества механизмов KDF.[2] Основным подходом, которому следует HKDF, является парадигма «извлечение-затем-расширение», в которой KDF логически состоит из двух модулей: на первом этапе используется входной ключевой материал и «извлекается» из него псевдослучайный ключ фиксированной длины, а затем второй. stage «расширяет» этот ключ до нескольких дополнительных псевдослучайных ключей (вывод KDF).[2]

Его можно использовать, например, для преобразования общих секретов, которыми обмениваются через Диффи – Хеллмана в ключевой материал, подходящий для использования при шифровании, проверке целостности или аутентификации.[1]

Формально это описано в RFC 5869.[2] Один из его авторов также описал алгоритм в сопроводительной статье 2010 года.[1]

В ноябре 2011 г. NIST выпущен SP 800-56C,[3] заменен в апреле 2018 г. SP 800-56C Rev.1.[4] Оба заявляют, что спецификация HKDF[2] является соответствующей схемой и укажите на ее бумагу[1] для обоснования механизмов извлечения и расширения рекомендаций.

Существуют реализации HKDF для C #, Go,[5] Ява,[6] JavaScript,[7] Perl, PHP,[8] Python,[9] Ruby и другие языки.

Механизм

HKDF извлекает псевдослучайный ключ (PRK) с помощью HMAC хеш-функция (например, HMAC -SHA2 56) на необязательном поваренная соль (действующий как ключ) и любой потенциально слабый входной ключевой материал (IKM) (действующий как данные). Затем он генерирует аналогично криптографически стойкий материал выходного ключа (OKM) любой желаемой длины, многократно генерируя хэш-блоки с PRK-ключом и затем добавляя их в материал выходного ключа, в конечном итоге усекая до желаемой длины.

Для дополнительной безопасности HMAC-хэшированные блоки с PRK-ключом объединяются в цепочку во время их генерации путем добавления предыдущего хэш-блока к возрастающему 8-битному счетчику с необязательной контекстной строкой в ​​середине перед хешированием HMAC для генерации текущего хэш-блока.

Примечание: HKDF не увеличивает энтропию, но позволяет более равномерно и эффективно использовать большой источник более слабой энтропии.

Использует

HKDF имеет два основных и потенциально независимых использования:

  1. Чтобы «извлечь» (конденсировать / смешать) энтропия из более крупного случайного источника, чтобы обеспечить более равномерно несмещенную и более высокую энтропию, но меньший выход (например, ключ шифрования ). Это достигается за счет использования свойств распространения криптографических MAC.
  2. Чтобы «расширить» сгенерированный вывод уже достаточно случайного ввода, такого как существующий общий ключ, в более крупный криптографически независимый вывод, тем самым создавая несколько ключей детерминированно из этого исходного общего ключа, так что один и тот же процесс может безопасно создавать те же секретные ключи на нескольких устройствах, пока используются одни и те же входы.

Эти две функции также можно комбинировать и использовать для формирования ГПСЧ для улучшения потенциально смещенного вывода генератора случайных чисел, а также для защиты его от анализа и помощи в защите генерации случайных чисел от злонамеренных входных данных.

Пример: реализация Python

#! / usr / bin / env python3импорт хэшлибимпорт hmacот математика импорт потолокhash_len = 32def hmac_sha256(ключ, данные):    вернуть hmac.новый(ключ, данные, хэшлиб.Sha256).переваривать()def hkdf(длина: int, ikm, поваренная соль: байты = б"", Информация: байты = б"") -> байты:    "" "Функция вывода ключа" ""    если len(поваренная соль) == 0:        поваренная соль = байты([0] * hash_len)    prk = hmac_sha256(поваренная соль, ikm)    т = б""    окм = б""    для я в ассортимент(потолок(длина / hash_len)):        т = hmac_sha256(prk, т + Информация + байты([1 + я]))        окм += т    вернуть окм[:длина]

использованная литература

  1. ^ а б c d Кравчик, Хьюго (2010). «Криптографическое извлечение и создание ключей: схема HKDF» (PDF). Архив криптологии ePrint. Международная ассоциация криптологических исследований.
  2. ^ а б c d е Krawczyk, H .; Эронен, П. (май 2010 г.). «RFC 5869». Инженерная группа Интернета.
  3. ^ Лили Чен (ноябрь 2011 г.). «Рекомендация по получению ключа путем извлечения с последующим расширением». Специальная публикация NIST серии 800. Национальный институт стандартов и технологий. Цитировать журнал требует | журнал = (Помогите)
  4. ^ Элейн Баркер; Лили Чен; Ричард Дэвис (апрель 2018 г.). «Рекомендации по методам получения ключей в схемах создания ключей». Специальная публикация NIST серии 800. Национальный институт стандартов и технологий. Цитировать журнал требует | журнал = (Помогите)
  5. ^ "пакет hkdf". godoc.org.
  6. ^ «Автономная реализация Java 7 функции вывода ключей на основе HMAC». github.com.
  7. ^ «Реализация RFC5869 в Node.js: функция извлечения и расширения ключа на основе HMAC». npmjs.com.
  8. ^ "hash_hkdf - Создать вывод ключа HKDF из предоставленного ключевого ввода". php.net.
  9. ^ «Основанная на HMAC функция извлечения и расширения ключа (HKDF), реализованная в Python». github.com.

внешние ссылки