SHA256、SHA512、MD5为C#中的不同文件生成完全相同的哈希.NET 6



我有一个奇怪的问题。我有以下非常基本的代码:

private async Task<string> _CalculateChecksum(Stream strm)
{
System.Security.Cryptography.MD5 sha = System.Security.Cryptography.MD5.Create();
byte[] checksum = await sha.ComputeHashAsync(strm);
//return BitConverter.ToString(checksum).Replace("-", "");
return Convert.ToBase64String(checksum);
}

我想计算文件的哈希值。我先用SHA256试过。无论我是将散列算法从MD5更改为SHA256还是SHA512,不同文件生成的散列值总是相同的。例如:其中一个测试文件的大小约为4。比其他文件大。哈希与所有算法相同。我也尝试使用BitConverter.ToString而不是Convert.ToBase64String,但这并不重要,因为校验和字节数组的内容完全相同。

我也尝试过使用普通(非异步(方法,但结果是一样的。

有人知道为什么会发生这种事吗?

以下是散列部分的代码:

MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
string hash = await _CalculateChecksum(ms);

"文件";是包含正确值的IFormFile对象。

await file.CopyToAsync(ms)之后,内存流的位置在它的末尾。sha.ComputeHashAsync(strm)计算当前位置之后的数据的散列,因此基本上是空流的散列。

尝试在调用_CalculateChecksum:之前将流的位置重置为起始位置

MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
string hash = await _CalculateChecksum(ms);

最新更新