Make sure the info parameter contains random elements.
From: https://soatok.blog/2021/11/17/understanding-hkdf/
(PHP 7 >= 7.1.2, PHP 8)
hash_hkdf — Формирует HKDF-ключ из исходного ключа
algo
Название алгоритма хеширования, например "sha256"
.
Список алгоритмов, которые поддерживает функция, приводит описание функции hash_hmac_algos().
Замечание:
Некриптографические хеширующие функции не допускаются.
key
Входные необработанные двоичные данные. Параметр нельзя оставлять пустым.
length
Длина вывода в байтах. Нельзя превышать размер хеш-функции более чем в 255 раз.
При передаче в параметр length
значения 0
длина вывода по умолчанию приравнивается к размеру хеш-значения, которое возвращает заданная в первом параметре хеш-функция.
info
Информационная строка, специфичная для приложения или контекста.
salt
Соль для формирования ключа.
Добавление произвольной соли значительно повышает прочность HKDF-ключа, хотя параметр и необязателен.
Функция возвращает строку, которая содержит необработанное двоичное представление производного ключа, которое также знают как выходной ключевой материал (англ. Output Keying Material, OKM).
Функция выбрасывает исключение ValueError, если параметр key
пуст,
в параметре algo
указали неизвестный или некриптографический
алгоритм, параметр length
меньше 0
или чрезмерно большой — больше чем в 255 раз превышает размер хеш-функции.
Версия | Описание |
---|---|
8.0.0 |
Функция при ошибке теперь выбрасывает ошибку ValueError;
раньше выдавалась ошибка уровня E_WARNING и возвращалось значение false .
|
В приведённом примере создаётся пара отдельных ключей, которые подходят для создания конструкции «зашифровать, затем сформировать ключ HMAC» через алгоритм AES-256 для шифрования и алгоритм SHA-256 для аутентификации.
Пример #1 Пример формирования HKDF-ключ из исходного функцией hash_hkdf()
<?php
// Генерируем случайный ключ и соль для усиления процесса формирования
$inputKey = random_bytes(32);
$salt = random_bytes(16);
// Формируем пару разных ключей с одними и теми же входными данными
$encryptionKey = hash_hkdf('sha256', $inputKey, 32, 'aes-256-encryption', $salt);
$authenticationKey = hash_hkdf('sha256', $inputKey, 32, 'sha-256-authentication', $salt);
var_dump($encryptionKey !== $authenticationKey); // bool(true)
?>
Make sure the info parameter contains random elements.
From: https://soatok.blog/2021/11/17/understanding-hkdf/