Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

HKDF - это функция простого вывода ключей (KDF), основанная на хэш- коде аутентификации [1] сообщения (HMAC). [2] Первоначально он был предложен его авторами в качестве строительного блока в различных протоколах и приложениях, а также для предотвращения распространения множества механизмов KDF. [2] Основным подходом, которому следует HKDF, является парадигма «извлеките-затем-разверните», где KDF логически состоит из двух модулей: на первом этапе берется входной ключевой материал и «извлекается» из него псевдослучайный ключ фиксированной длины, и затем второй этап «расширяет» этот ключ до нескольких дополнительных псевдослучайных ключей (вывод 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] Java, [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 import  hashlib import  hmac from  math  import  ceilhash_len  =  32def  hmac_sha256 ( ключ ,  данные ):  вернуть  hmac . новый ( ключ ,  данные ,  хэш-библиотека . sha256 ) . дайджест ()def  hkdf ( length :  int ,  ikm ,  salt :  bytes  =  b "" ,  info :  bytes  =  b "" )  ->  bytes :  "" "Функция вывода ключа" ""  if  len ( salt )  ==  0 :  salt  =  bytes ([ 0 ]  *  hash_len )  prk  =  hmac_sha256 ( salt ,  ikm )  t  = b ""  okm  =  b ""  для  i  в  диапазоне ( ceil ( length  /  hash_len )):  t  =  hmac_sha256 ( prk ,  t  +  info  +  bytes ([ 1  +  i ]))  okm  + =  t  return  okm [: length ]

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • RFC 5869: функция извлечения и расширения ключа на основе HMAC (HKDF)