【问题标题】:Why does SHA256Managed().ComputeHash() return a different hash than from what external tools produce?为什么 SHA256Managed().ComputeHash() 返回的哈希值与外部工具生成的哈希值不同?
【发布时间】:2021-06-21 10:02:39
【问题描述】:

作为个人练习,我一直在尝试在我正在编写的一个小程序中生成 SHA256 哈希值。我的计算机上有一个已加载到程序中的任意位图文件。某处有问题,我无法识别。我的程序返回的哈希是5EFFCC89AEA1922485CFA721194320D8895A4F31AC4AA5134AC2104C528033BA,但是当我在完全相同的文件上运行7-Zip 的SHA256 工具时,它返回D78859AD5651EB23A771C4763D03E65D64550C0660F7E182668586398CF02BF9。这是我的代码:

var image = new Bitmap(@"C:\Users\1\image.bmp");
var stream = new MemoryStream();
image.Save(stream, ImageFormat.Bmp);
var hashedBytes = new SHA256Managed().ComputeHash(stream);
var hash = string.Concat(hashedBytes.Select(x => x.ToString("X2")));

唯一看起来可能导致问题的代码是将图像转换为MemoryStream 对象。但如果我理解正确的话,这实际上只是一个字节数组,所以它似乎不应该改变任何数据。

我的代码有什么问题?

【问题讨论】:

  • 如果您要计算文件的哈希值,为什么不使用FileStream 而不是先将其具体化为位图,然后再使其成为流?据我所知,这不能保证是幂等操作(即使散列计算在其他方面是完美的)。
  • 您是否多次运行相同的结果?
  • 我认为您应该将流重置为其起始位置。为了获得可比较的结果,请从未解释的文件中获取哈希,而不是从位图中获取。
  • @JeroenMostert 很抱歉造成混乱。你提出了一个很好的观点,我很感激你的意见。然而,这个程序会生成位图图像,我将计算它们的哈希值。但是在试图找出散列差异问题时,我使用磁盘上的一个文件进行测试,这样我就可以最大限度地减少程序中的可变性。

标签: c# sha


【解决方案1】:

将图像写入内存流后,其位置将设置为流的末尾。如果你在那个状态下将它传递给ComputeHash(),它将没有字节可以散列。

因此,在将流传递给ComputeHash() 之前,您必须将位置重置为零:

var image  = new Bitmap(@"C:\Users\1\image.bmp");
var stream = new MemoryStream();
image.Save(stream, ImageFormat.Bmp);
stream.Position = 0;
var hashedBytes = new SHA256Managed().ComputeHash(stream);
var hash        = string.Concat(hashedBytes.Select(x => x.ToString("X2")));

【讨论】:

  • 重置流位置是问题所在。我不知道有关流的信息。谢谢你教我一些东西!
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2012-07-22
  • 2014-12-31
相关资源
最近更新 更多