Хэш файла MD5 для одного и того же неизмененного файла каждый раз отличается - PullRequest
6 голосов
/ 28 августа 2009

Добрый вечер всем,

Я работал над инструментом MD5 в C #, который принимает файл, просматривает мой класс Hasher и выводит результат в базу данных вместе с именем файла и каталогом.

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

Ниже приведен код, который я использую

HashAlgorithm hmacMd5 = new HMACMD5(); 
byte[] hash;
try
{
    using (Stream fileStream = new FileStream(fileLocation, FileMode.Open))
    {
        using (Stream bufferedStream = new BufferedStream(fileStream, 5600000))
        {
            hash = hmacMd5.ComputeHash(bufferedStream);
            foreach (byte x in hash)
            {
                md5Result += x;
            }
        }
    }
}
catch (UnauthorizedAccessException uae) { }

return md5Result;

Вот результаты для 3 отдельных прогонов hello.mp2:

1401401571161052548110297623915056204169177

16724366215610475211823021169211793421

56154777074212779619017828183239971

Довольно загадочно. Моя единственная разумная мысль относительно того, почему я получаю эти результаты, заключается в объединении байта в строку.

Может кто-нибудь заметить проблему здесь?

С уважением,

Ric

Ответы [ 3 ]

14 голосов
/ 28 августа 2009

Вы должны использовать System.Security.Cryptography.MD5 вместо.

HMACMD5 не вычисляет хеш, он вычисляет код аутентификации сообщения.

HMACMD5 - это тип ключевого хэша Алгоритм, который построен из MD5 хэш-функция и используется в качестве Код аутентификации сообщений на основе хеша (HMAC). Процесс HMAC смешивает секретный ключ с данными сообщения, хеширует результат с помощью хеша функция, смешивает хэш-значение с секретный ключ снова, затем применяет хэш-функция во второй раз. выходной хеш будет 128 бит длиной

Поскольку вы не предоставляете ключ HMAC, он генерируется случайным образом для вас от вашего имени и заставляет вас видеть разные результаты.

0 голосов
/ 28 августа 2009

Мое предложение заключается в том, что вы не вычисляете хэши MD5, поскольку MD5 выдает фиксированную длину, равную 32 шестнадцатеричным числам

Кроме того, поскольку вы не видите цифр от 0xA до 0xF, это довольно загадочно

Возможно, вы захотите проверить «реальный» результат с помощью онлайн-калькуляторов MD5, таких как этот

0 голосов
/ 28 августа 2009

Между вами не должно быть bufferedStream. Я предполагаю, что разное количество байтов буферизуется при каждом запуске.

...