对于我的雇主,我必须向网络应用程序的客户提供他们下载的某些文件的校验和。
我想向用户展示他们的客户端工具也可能生成的哈希,因此我一直在比较在线哈希工具。我的问题是关于哈希的形式,因为它们之间的差异非常奇怪。
快速搜索后,我用5进行了测试:
输入值“ test”(在其后没有“ enter”)都将给我5个相同的SHA256结果。但是,这里开始特殊的事情,当我输入值“ test [enter] test”(所以有两行)时,在线工具1、2和3给我相同的SHA256哈希,而站点4和5给我一个不同的哈希值(因此1、2和3相等,而4和5相等)。这很可能与工具或底层代码处理\ r \ n的方式有关,或者至少我认为如此。
巧合的是,站点1,站点2和站点3给我呈现的哈希值与我的C#代码相同:
var sha256Now = ComputeHash(Encoding.UTF8.GetBytes("test\r\ntest"), new SHA256CryptoServiceProvider());
private static string ComputeHash(byte[] inputBytes, HashAlgorithm algorithm)
{
var hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes);
}
问题是:哪些网站是“正确的”?
有没有办法知道哈希是否符合标准?
UPDATE1:将编码更改为UTF8。但是,这对创建的输出哈希没有影响。谢谢@Hans。(因为我的Encoding.Default可能是Encoding.UTF8)
UPDATE2:也许我应该扩大问题的范围,因为它可能无法被解释,对不起。我想我要问的更多是可用性问题,而不是技术问题。我是否应该提供所有具有不同行尾的哈希值?还是我应该坚持一个?客户可能会致电我的公司,担心他们的文件如果以不同的方式计算哈希值,则会因某种原因而更改。通常如何解决?
所有这些站点都返回有效值。
站点4和5\n
用作换行符。
编辑
我看到您编辑了问题以添加Encoding.Default.GetBytes
到代码示例中。
这很有趣,因为在计算散列之前,您会看到有一些string to byte array conversion
要运行的东西。换行(或)以及文本编码都是解释字符串以获取不同字节值的两种方式。\n
\r\n
一旦具有与输入相同的字节,所有哈希结果将是相同的。
编辑2:
如果直接处理字节,则只需使用这些字节计算哈希即可。不要尝试提供不同的哈希值;哈希只能返回一个值。如果您的客户的哈希值与您的哈希值不同,那么他们做错了。
话虽这么说,我很确定它永远不会发生,因为没有任何方法可以误解字节数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句