【问题标题】:Different MD5 file hash in C# and PHPC# 和 PHP 中不同的 MD5 文件哈希
【发布时间】:2013-03-29 14:51:42
【问题描述】:

我在检查 C# 和 PHP 中文件的 MD5 校验和时遇到了一个小问题。 PHP脚本计算的hash与C#计算的hash不同。

libcurl.dll C#   = c3506360ce8f42f10dc844e3ff6ed999
libcurl.dll PHP  = f02b47e41e9fa77909031bdef07532af

在 PHP 中我使用 md5_file 函数,而我的 C# 代码是:

protected string GetFileMD5(string fileName)
{
    FileStream file = new FileStream(fileName, FileMode.Open);
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] retVal = md5.ComputeHash(file);
    file.Close();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < retVal.Length; i++)
    {
        sb.Append(retVal[i].ToString("x2"));
    }
    return sb.ToString();
}

任何想法如何计算相同的哈希?我认为这可能与编码有关。

提前致谢!

【问题讨论】:

  • 我敢打赌 C# 使用 Windows-1250 编码,而您的 PHP 脚本使用 UTF-8ISO-8859-1 编码...尝试使两边的编码相同...
  • 与命令行工具md5sum相比如何?
  • 使用 FileStream,您不能确定指针在开始处。使用 file.Seek(0, SeekOrigin.Begin) 确保这是正确的。 msdn 中的所有示例都在 FileStream 构造函数之后使用它。
  • @Jack md5sum 返回 d41d8cd98f00b204e9800998ecf8427e 但有点奇怪,因为它和 md5("") 一样
  • @shadyyx PHP 不使用任何编码,PHP 中的字符串与byte[] 相同,因此无需 PHP 解码。

标签: c# php encoding md5 checksum


【解决方案1】:

我的 C# 生锈了,但会:

byte[] retVal = md5.ComputeHash(file);

实际上读入了整个文件?我认为它只是散列流对象。我相信您需要读取流,然后对整个文件内容进行哈希处理?

  int length = (int)file.Length;  // get file length
  buffer = new byte[length];      // create buffer
  int count;                      // actual number of bytes read
  int sum = 0;                    // total number of bytes read

  // read until Read method returns 0 (end of the stream has been reached)
  while ((count = file.Read(buffer, sum, length - sum)) > 0)
      sum += count;  // sum is a buffer offset for next reading
  byte[] retVal = md5.ComputeHash(buffer);

我不确定它是否真的按原样运行,但我认为需要一些类似的东西。

【讨论】:

  • 它给出的结果与使用 ComputeHash 的结果相同。
【解决方案2】:

我用这个:

我还没有比较 php md5 和 c# md5 的问题

System.Text.UTF8Encoding text = new System.Text.UTF8Encoding();
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();                
Convert2.ToBase16(md5.ComputeHash(text.GetBytes(encPassString + sess)));


class Convert2
{
   public static string ToBase16(byte[] input)
   {
      return string.Concat((from x in input select x.ToString("x2")).ToArray());
   }
}

【讨论】:

  • 是关于文件 md5 的吗?还是只是文字?
  • 无需将文件解码为文本即可获得 MD5。如果不是 UTF-8 怎么办?
猜你喜欢
  • 2018-11-08
  • 2015-07-07
  • 2014-05-19
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多