Хеш файла MD5 для одного и того же неизмененного файла каждый раз отличается
Всем добрый вечер,
Я работал над инструментом 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 ответа
Вы должны скорее использовать System.Security.Cryptography.MD5.
HMACMD5 не вычисляет хеш, он вычисляет код аутентификации сообщения.
HMACMD5 - это тип алгоритма хеширования с ключами, который построен на основе хеш-функции MD5 и используется в качестве кода аутентификации сообщений на основе хэширования (HMAC). Процесс HMAC смешивает секретный ключ с данными сообщения, хэширует результат с помощью хэш-функции, снова смешивает это хеш-значение с секретным ключом, а затем применяет хэш-функцию во второй раз. Выходной хеш будет 128 бит длиной
Поскольку вы не предоставляете ключ HMAC, он генерируется случайным образом для вас от вашего имени и приводит к тому, что вы видите разные результаты.
Я предлагаю вам не вычислять хеши MD5, поскольку MD5 выдает фиксированную длину 32 шестнадцатеричных числа
Кроме того, так как вы не видите цифр от 0xA до 0xF, это довольно загадочно
Возможно, вы захотите проверить "реальный" результат с помощью онлайн-калькуляторов MD5, таких как этот
Между вами не должно быть bufferedStream. Я предполагаю, что разное количество байтов буферизуется при каждом запуске.