【问题标题】:MD5 file hash for the same unchanged file is different each time C#同一未更改文件的 MD5 文件哈希每次 C# 都不同
【发布时间】:2014-05-18 20:28:38
【问题描述】:

大家晚上好,

我一直在使用 C# 开发一个 MD5 工具,它接收一个文件,通过我的 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

相当令人费解。 关于为什么我得到这些结果,我唯一理性的想法是将字节连接到字符串。

谁能在这里发现问题?

问候,

瑞克

【问题讨论】:

    标签: hash md5


    【解决方案1】:

    你应该改用System.Security.Cryptography.MD5

    HMACMD5 不计算哈希,它计算消息验证码。

    HMACMD5 是一种键控哈希 从构造的算法 MD5 哈希函数并用作 基于散列的消息认证码 (HMAC)。 HMAC 工艺混合了一个 带有消息数据的密钥, 用哈希对结果进行哈希处理 函数,将该哈希值与 再次密钥,然后应用 哈希函数第二次。这 输出哈希的长度为 128 位

    由于您没有提供 HMAC 密钥,系统会为您随机生成一个 HMAC 密钥,这会导致您看到不同的结果。

    【讨论】:

      【解决方案2】:

      我的建议是您不计算 MD5 哈希值,因为 MD5 生成 32 个十六进制数字的固定长度输出

      另外,由于你没有看到从 0xA 到 0xF 的任何数字,这很令人费解

      您可能想用online MD5 calculators such as this one检查“真实”结果

      【讨论】:

        【解决方案3】:

        您之间不应有 bufferedStream。我猜每次运行都会缓冲不同数量的字节。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-27
          • 2016-10-02
          相关资源
          最近更新 更多