Какова цель использования HKDF?

Я видел фрагмент кода, который генерирует ключ AES с помощью следующих шагов:

  1. Создайте 16-байтовый массив случайных значений.

    SecureRandom random = new SecureRandom();
    byte[] key = new byte[16];
    random.nextBytes(key); 
    
  2. примените HKDF к ключу, чтобы сгенерировать новый ключ шифрования.

encrypt_key = KeyDerivation.hkdfSha256(Key,
                           /* inputSalt =*/ null,
                           hkdfInfoString.getBytes("UTF-8"),
                           16);

Я не понимаю, почему нам нужны два шага. SecureRandom, кажется, дает достаточно энтропии для ключа, верно? Два вопроса:

  1. Можем ли мы использовать key в 1) непосредственно для шифрования AES?
  2. Какое влияние оказывает нулевая соль в 2)? Я рассматриваю, возможно, дополнительный шаг 2) - это защита утечки ключа (просто предположение). Если да, делает ли нулевая соль недействительной цель? Потому что мы можем предварительно вычислить связь между входным ключевым материалом HKDF и его выходом.

HKDF утверждает, что соль не является обязательной, хотя использование случайной соли усиливает ее. Я смущен тем, что когда требуется HKDF (особенно без соли). Если у нас уже есть ключ с достаточной энтропией, зачем он нам? Если у нас слабый ключ без достаточной энтропии, как HKDF (без соли) помогает в этой ситуации? Я предполагаю, что злоумышленник может предварительно вычислить соответствие между слабым ключом и сгенерированным ключом, верно?

1 ответ

Решение
  1. Можем ли мы использовать ключ в 1) непосредственно для шифрования AES?

Да, ты можешь. Однако есть причины, по которым вы захотите менять ключи так часто, например, ограничения алгоритма / схемы, отсутствие утечки (главного) ключа, расширение материала ключа, получение нескольких ключей и / или значений IV и т. Д. И т. Д. ну все, для чего вам нужен KBKDF в первую очередь (HKDF - это функция деривации ключа на основе хэша).

Однако, если есть только один 128-битный ключ, полученный из другого 128-битного ключа, я не вижу большой пользы. Единственное, где это может быть полезно, - это если вы не доверяете безопасности своего SecureRandom реализация, поскольку KDF устанавливает еще один уровень HMAC, чтобы прорваться, когда злоумышленник пытается угадать состояние (очевидно слабого) генератора случайных чисел.

Конечно, как вы указали в своем вопросе, злоумышленник может угадать состояние случайного генератора, но, по крайней мере, злоумышленник не может получить информацию о состоянии, например, изменив расчет или получив статистическую информацию о состоянии.

  1. Каково влияние нулевой соли в 2)? Я рассматриваю, возможно, дополнительный шаг 2) - это защита утечки ключа (просто предположение). Если да, делает ли нулевая соль недействительной цель? Потому что мы можем предварительно вычислить связь между входным ключевым материалом HKDF и его выходом.

Нет, функция вывода ключа является односторонней, независимо от того, присутствует соль или нет. Соль используется в доказательстве безопасности HKDF. Однако на самом деле это не обязательно для обеспечения достаточной безопасности. Если вы можете добавить / сохранить / передать соль, это повысит безопасность, но существует множество KBKDF, которые (явно) не позволяют использовать соль. С другой стороны: KDF на основе паролей, такие как PBKDF2, действительно нуждаются в особой безопасности для обеспечения безопасности.

Другие вопросы по тегам