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

SHA256, SHA512, MD5 generates exactly the same hash for different files in 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,不过没关系,因为checksum字节数组的内容是完全一样的。

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

有人知道为什么会这样吗?

这里是调用散列部分的代码:

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);