notepad.exe SHA256哈希值计算结果不一致,代码是否存在问题?
问题:C#计算SHA256哈希与PowerShell Get-FileHash结果不一致
我尝试计算notepad.exe的SHA256哈希值,使用了以下C#代码:
public string GetSHA256Hash(string path) { string hashdata = null; using (FileStream fs = File.OpenRead(path)) { SHA256CryptoServiceProvider hashprovider = new SHA256CryptoServiceProvider(); hashdata = BitConverter.ToString(hashprovider.ComputeHash(fs)).Replace("-", string.Empty); } return hashdata; }
但通过PowerShell的Get-FileHash命令校验时,得到的哈希值不同,已确认文件路径正确,请问上述代码是否存在问题?
回答
你的代码确实有两个容易踩的坑,导致和PowerShell的结果不一致:
- 大小写差异:
BitConverter.ToString()生成的哈希字符串是大写字母,而PowerShell的Get-FileHash默认输出的是小写字母的哈希值。直接对比大小写不同的字符串,自然会被判定为不相等。 - 过时API隐患:
SHA256CryptoServiceProvider是.NET Framework时期的旧API,在.NET Core/.NET 5+中已经被标记为过时,不仅可能有兼容性问题,还存在潜在的性能或安全优化缺失。
修正后的代码可以解决这些问题:
public string GetSHA256Hash(string path) { string hashdata = null; using (FileStream fs = File.OpenRead(path)) { // 使用官方推荐的SHA256.Create()替代过时的哈希提供者 using (SHA256 hashprovider = SHA256.Create()) { byte[] hashBytes = hashprovider.ComputeHash(fs); // 转换为小写十六进制字符串,和PowerShell输出格式对齐 hashdata = BitConverter.ToString(hashBytes).Replace("-", string.Empty).ToLowerInvariant(); } } return hashdata; }
另外补充一个小提醒:如果文件在你两次读取的间隙被修改(比如系统后台更新替换了notepad.exe),也可能导致哈希不一致,但你已经确认路径正确,所以大概率是大小写的锅——你可以先手动把C#输出的哈希转成小写,再和PowerShell结果对比,验证这个猜想。
内容的提问来源于stack exchange,提问作者user14374034
相关产品推荐
相关产品推荐

