SHA256哈希计算

时间:2013-12-26 12:05:29

标签: c# sha256

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

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

快速搜索后,我用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
  6. 输入值'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:也许我应该稍微扩展一下这个问题,因为它可能没有得到解释,抱歉。我想我要问的更多的是可用性问题,而不是技术问题;我应该提供具有不同行结尾的所有哈希吗?或者我应该坚持一个?如果他们有不同的计算哈希的方式,客户可能会打电话给我的公司担心他们的文件被改变了。这通常是如何解决的?

2 个答案:

答案 0 :(得分:2)

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

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


修改

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

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

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


编辑2:

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

话虽如此,我很确定它不会发生,因为没有办法误解字节数组。

答案 1 :(得分:0)

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

示例:

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