2009-07-27 1 views
1

У меня есть кромка. Я строю код, который читает двоичные файлы данных, созданные коммерческим инструментом с закрытым исходным кодом. Информация о формате данных указана в документе.HMACSHA1 определен для сообщений нулевой длины?

Для проверки целостности данных спецификация поставщика запрашивает HMAC на основе SHA1, используя ключ, полученный из пароля в соответствии с RFC2898. Многие среды программирования имеют класс HMACSHA1 для создания этих хэшей.

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

Однако, когда длина потока данных равна нулю, инструмент поставщика испускает хэш, который НЕ все нули. Я не знаю, откуда оно взялось, если нет сообщения для запуска через HMACSHA1.

Для HMACSHA1 или для любого HMAC - это MAC, определенный для краевого случая «нулевого сообщения»?

Я использую .NET и класс System.Security.Cryptography.HMACSHA1, хотя я считаю, что мой вопрос носит платформо-агностик.


Существует одна платформа конкретного бита: Когда я пытаюсь получить свойство Hash на экземпляр этого типа, если я не запускать любые данные через экземпляр, я получаю

Exception: System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Security.Cryptography.HashAlgorithm.get_Hash() 

Для меня это не удивительно, поскольку хэш не имеет ничего общего.

Подсвечники:

ответ

3

Бесшумный в темноте, я нашел то, что мне нужно. Не уверен, что HMACSHA1 определен для случая сообщения с нулевой длиной, BUT

Я нашел это на .NET, если я вызываю HMACSHA1.ComputeHash() и передаю массив байтов длины ноль, я получаю ожидаемый, желаемый хеш.

Извините за шум, мы вернем вас к ранее запланированному программированию.

+0

Это означает, что HMACSHA1 определен для сообщения нулевой длины, но не для неопределенного (нулевого) сообщения.Как и ожидалось. –

1

Нужно ли пытаться добавить массив с нулевой длиной в хэш? Основной объект, вероятно, создается во время первого вызова.

Используя несколько реализаций хэширования файл нулевой длины дает:

MD5 : d41d8cd98f00b204e9800998ecf8427e 
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709 
+0

Для HMACSHA1 требуется ключ, который вы не указали. Также выполнение, которое я выполняю, использует Соль. Таким образом, фактические хеши, которые вы даете, не очень полезны. – Cheeso

+0

Упс, полусон и не прочитал вопрос правильно. Это прямые значения хеширования MD5/SHA1, а не HMAC. – devstuff

4

HMACSHA1 определяется для всех входов из п битов, где 0 = п < < 2^20 - определен 160.

HMACSHA1 как SHA1 (K*) SHA1 (K** текст)), где K* и K** - 20 байтов значений, полученных от ключа (см. FIPS 198a).

Таким образом, HMACSHA1 («пустая строка») = SHA1 (K*) SHA1 (K**)), который очень четко определен.

+0

Спасибо, очень полезно. – Cheeso

Смежные вопросы