SHA256哈希计算

对于我的雇主,我必须为他们下载的某些文件提供带有校验和的网络应用程序的客户。

我想向用户提供他们的客户端工具也可能生成的哈希值,因此我一直在比较在线哈希工具。 我的问题是关于它们的散列forms,因为它们不同,奇怪的是。

经过快速搜索,我测试了5:

  1. http://www.convertstring.com/Hash/SHA256
  2. http://www.freeformatter.com/sha256-generator.html#ad-output
  3. http://online-encoder.com/sha256-encoder-decoder.html
  4. http://www.xorbin.com/tools/sha256-hash-calculator
  5. http://www.everpassword.com/sha-256-generator

输入值’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)

更新2:也许我应该稍微扩展一下这个问题,因为它可能没有得到解释,对不起。 我想我要问的更多的是可用性问题,而不是技术问题; 我应该提供具有不同行结尾的所有哈希吗? 或者我应该坚持一个? 客户端可能会打电话给我的公司,如果他们有不同的计算哈希方式,他们会以某种方式改变他们的文件。 这通常如何解决?

所有这些网站都返回有效值。

站点4和5使用\n作为换行符。


编辑

我看到你编辑了你的问题,在代码示例中添加了Encoding.Default.GetBytes

这很有趣,因为您看到计算哈希值之前有一些string to byte array conversion 。 换行( \n\r\n )以及文本编码都是解释字符串以获取不同字节值的两种方法。

一旦你有与输入相同的字节,所有哈希结果将是相同的。


编辑2:

如果您直接处理字节,那么只需用这些字节计算哈希值。 不要尝试提供不同的哈希值; 哈希必须只返回一个值 。 如果您的客户端具有与您的客户端不同的哈希值,那么他们做错了

话虽如此,我很确定它永远不会发生,因为没有任何方法可以误解字节数组。

Microsoft在System.Web.Helpers名称空间中有一个名为Crypto的类,它具有开箱即用的SHA256哈希。

例:

 var plainText = "Text"; var hashedText = System.Web.Helpers.Crypto.SHA256(plainText);