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);
我有一个奇怪的问题。我有以下非常基本的代码:
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);