繁体   English   中英

SHA256哈希计算

[英]SHA256 hash calculation

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

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

经过快速搜索,我测试了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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM