为什么 SHA256Managed().ComputeHash() 返回的哈希值与外部工具生成的哈希值不同?

问题描述

作为个人练习,我一直在尝试在我正在编写的一个小程序生成 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 对象。但如果我理解正确的话,这实际上只是一个字节数组,所以它似乎不应该改变任何数据。

我的代码有什么问题?

解决方法

将图像写入内存流后,其位置将设置为流的末尾。如果您在该状态下将其传递给 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")));