hmac init со значением iv, отличным от значения по умолчанию в java

Я пытаюсь рассчитать HMAC с помощью iv (без каких-либо дополнительных ключей). Мне нужно передать его на уровне "init". Я знаю, что обычно нет необходимости передавать iv, так как для hmac / sha есть ivs по умолчанию. Но если я не хочу использовать значения по умолчанию и хочу предоставить свой собственный iv, как это можно реализовать в Java? Я пытался использовать Javax, но это MAC-инициализация принимает только ключ подписи.

Например:

Mac hmac = Mac.getInstance("HmacSHA1");
byte[] hmacKeyBytes = key.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(hmacKeyBytes, "HmacSHA1");
hmac.init(secretKey);
  • Я хочу начать с некоторого значения iv. Но не знаю как.

Я имею в виду начальное значение, используемое для запуска итеративного процесса hash / hmac. Обычно это какое-то произвольное число, недоступное пользователю. Я хочу, чтобы иметь возможность изменить этот вектор инициализации по умолчанию для хэш-функций / найти способ предоставить свой собственный iv. Как мне это сделать?

Спасибо!

2 ответа

HMAC принимает в качестве исходного параметра только ключ. Фактически - один и тот же контент должен иметь один и тот же тег аутентификации, поэтому IV не требуется / не нужен по определению.

Насколько я помню, мои классы криптографии, имеющие нестатический IV, привели бы к уязвимостям с MAC/HMAC для некоторых реализаций алгоритма, но я больше не вспоминаю детали (вы можете спросить в разделе Криптография в стеке потока https://crypto.stackexchange.com/).

Если вы действительно хотите иметь своего рода IV, вы все равно можете добавить IV к содержанию.

HMAC-SHA1 называется кодом аутентификации сообщения ( MAC). Этот объект принимает в качестве ввода ключ K и сообщение X произвольной длины и выводит тег T. По сути, MAC безопасен, если трудно найти новый вход X и тег T, такой что HMAC-SHA1 (K, M) = T, для неизвестного ключа K.

Полагаю, вам интересно, что делать с IV, потому что вы используете HMAC-SHA1 с какой-то схемой шифрования? Например, шифрование AES-CTR использует IV. В этом случае вы должны зашифровать зашифрованный текст и IV. Итак, в псевдокоде:

(IV, C) := AES-CTR(K1, M) # Maybe the output is a string with the IV prepended
T := HMAC-SHA1(K2, (IV, C))
return (IV, C, T)

Кстати, HMAC-SHA1 больше не считается безопасным. Попробуйте использовать что-то вроде HMAC-SHA256.

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