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