计算哈希似乎与 SHA256 错误
Posted
技术标签:
【中文标题】计算哈希似乎与 SHA256 错误【英文标题】:Computed Hash seems to be wrong with SHA256 【发布时间】:2021-11-25 21:15:48 【问题描述】:我有以下类计算我要发送到服务器的文件的哈希值。
public class GetHashCode
public static string CalculateHash()
try
var filePath = "\\\\abc\\abc-fs\\_My-Data\\user\\Documents\\test.jpg";
var fileStream = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite);
var hashProvider = SHA256.Create();
var buffer = hashProvider.ComputeHash(fileStream);
return Convert.ToBase64String(buffer);
catch (Exception err)
Console.WriteLine(err);
return null;
当我通过另一个应用程序将文件发送到服务器时,我可以看到此操作的哈希与我使用上面的代码创建的哈希有点不同:
来自其他应用程序的哈希(正确的):
R7av4w6Ow3M3z%252bpKPBBpojzvLvyl6aM0Q7q%252bJ%252fDvLPQ%253d
使用我的代码生成的哈希:
R7av4w6Ow3M3z+pKPBBpojzvLvyl6aM0Q7q+J/DvLPQ=
所以好像特殊字符的编码有问题,但是我还不知道怎么解决。有人可以帮忙吗?提前致谢!
【问题讨论】:
注意:This:catch (Exception err) Console.WriteLine(err); return null;
是一种反模式,因为它隐藏了问题并使调试更加困难。如果在哈希生成过程中出现问题,您希望程序因“真正的”异常而崩溃,而不是因为方法返回 null
而遇到一些难以诊断的后续错误。如果您有时间,请阅读"fail early" concept。
感谢您的建议,我一定会看看!
【参考方案1】:
你的哈希没问题。
另一个应用程序的哈希似乎是 URL 编码的......两次!应用 URL 解码(例如使用WebUtility.UrlDecode
)两次似乎可以解决它。
R7av4w6Ow3M3z%252bpKPBBpojzvLvyl6aM0Q7q%252bJ%252fDvLPQ%253d
-> URLDecode
R7av4w6Ow3M3z%2bpKPBBpojzvLvyl6aM0Q7q%2bJ%2fDvLPQ%3d
-> URLDecode
R7av4w6Ow3M3z+pKPBBpojzvLvyl6aM0Q7q+J/DvLPQ=
【讨论】:
好的,其他应用程序的哈希是 REST 响应的一部分,我忘了提及。所以哈希显然不是我的问题。 嗯,也许问题仍然与哈希有关。我想以相反的方式进行测试:对我的哈希进行编码,使其具有其他应用程序哈希的形式。UrlEncode
没有提供预期的结果,你知道怎么做吗?
@schmimla:应用 UrlEncode 两次对我有用:dotnetfiddle.net/gmKBR4。请注意,我使用HttpUtility.UrlEncode
而不是WebUtility.UrlEncode
,因为前者产生小写编码值而不是大写。以上是关于计算哈希似乎与 SHA256 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?
使用 Crypto++ 生成 SHA256 哈希,使用字符串作为输入和输出?