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