【问题标题】:Computing md5 hash计算 md5 哈希
【发布时间】:2012-04-14 04:00:08
【问题描述】:

我正在计算文件的 md5hash 以检查是否相同,所以我写了以下内容

private static byte[] GetMD5(string p)
{
    FileStream fs = new FileStream(p, FileMode.Open);
    HashAlgorithm alg = new HMACMD5();
    byte[] hashValue = alg.ComputeHash(fs);
    fs.Close();
    return hashValue;
}

并测试一开始我是否像这样称呼它

    var v1 = GetMD5("C:\\test.mp4");
    var v2 = GetMD5("C:\\test.mp4");

我在调试器中列出了 v1 和 v2 值,它们是不同的!!这是为什么呢?

【问题讨论】:

  • 是引用不同还是里面真的有不同的字节?
  • @CarstenKönig 它们的字节值不同......这 16 个字节是不同的
  • 我们需要更多代码来确定原因。
  • 是什么让你相信它们是不同的?你能告诉我们一些输出或调试器的屏幕截图吗?
  • 谢谢...显然我使用了错误的哈希算法我尝试了 Darkshadw 链接,上面写着 MD5 md5 = new MD5CryptoServiceProvider() 并且它有效..感谢所有按下“按下”我的问题的人,我会删除它..

标签: c# .net hash md5


【解决方案1】:

这是因为您使用的是HMACMD5,这是一种键控散列算法,它将键与输入相结合以产生散列值。当您通过它的默认构造函数创建 HMACMD5 时,它每次都会使用一个随机密钥,因此哈希值总是不同的。

你需要使用MD5:

private static byte[] GetMD5(string p)  
{  
  using(var fs = new FileStream(p, FileMode.Open))
  {
    using(var alg = new MD5CryptoServiceProvider())
    {
      return alg.ComputeHash(fs);  
    }
  }
}  

我也将代码更改为使用usings。

【讨论】:

  • 错误 1 ​​无法创建抽象类或接口“System.Security.Cryptography.MD5”的实例
  • 必须是新的MD5CryptoServiceProvider();
  • @CnativeFreak 是的,当然 - 哦 - 我总是忘记课程是 abstract
【解决方案2】:

来自HMACMD5 constructor doc

HMACMD5 是一种键控散列算法,由 MD5 散列函数,用作基于散列的消息验证码 (HMAC)。 HMAC 进程将密钥与消息数据混合, 用散列函数对结果进行散列,将该散列值与 再次使用密钥,然后再次应用散列函数 时间。输出哈希的长度为 128 位。

通过此构造函数,使用了一个 64 字节、随机生成的密钥。

(强调我的)

每次调用GetMD5(),您都会生成一个新的随机密钥。

您可能想使用System.Security.Cryptography.MD5Cng

【讨论】:

  • 谢谢...显然我使用了错误的哈希算法我尝试了 Darkshadw 链接,它说 MD5 md5 = new MD5CryptoServiceProvider();它奏效了
【解决方案3】:

我的猜测是你做了类似的事情:

Console.WriteLine(v1);
Console.WriteLine(v2);

Console.WriteLine(v1 == v2);

这只是表明变量值引用了不同的数组 - 它没有说明这些数组中的值。

试试这个(打印出十六进制):

Console.WriteLine(BitConverter.ToString(v1));
Console.WriteLine(BitConverter.ToString(v2))

【讨论】:

    【解决方案4】:

    使用ToString()方法获取数组字节的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 2017-01-27
      • 1970-01-01
      • 2011-08-27
      • 2012-07-12
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多