c# - SHA256哈希计算

标签 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

输入值“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);
    }

问题是:哪些网站“正确”?

有什么方法可以知道哈希是否符合标准?

更新 1:将编码更改为 UTF8。这对正在创建的输出哈希没有影响。谢谢@Hans。 (因为我的 Encoding.Default 可能是 Encoding.UTF8)

更新 2:也许我应该稍微扩展一下这个问题,因为它可能没有得到充分解释,抱歉。我想我问的更多是可用性问题而不是技术问题;我应该提供所有具有不同行尾的哈希值吗?还是我应该坚持一个?如果客户使用不同的哈希计算方法,他们可能会调用我的公司,担心他们的文件以某种方式被更改。这通常是如何解决的?

最佳答案

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

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


编辑

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

这很有趣,因为您看到有一些字符串到字节数组的转换要在计算散列之前运行。换行符(\n\r\n)和文本编码都是解释您的字符串以获得不同字节值的两种方法。

一旦您拥有与输入相同的字节,所有哈希结果都将相同。


编辑 2:

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

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

关于c# - SHA256哈希计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20784521/

相关文章:

c# - 检查类字段事件背后生成字段的属性

sha256 - 如何使用HMAC SHA256?

swift2 - 如何在 swift 2 & 3 中使用常见的加密和/或计算 sha256

java - SHA-256 自定义长度摘要

c# - 如何对在C#中使用LINQ使用反射找到的属性进行排序?

c# - App.Config 可以嵌入到.NET 应用程序中吗?

c# - 统一: No parameterless constructor defined for this object.

c# - 在 C# 中验证 MySQL 数据库的 SHA256 哈希值

sha256 - 内容安全策略 : What is a hash for href=javascript:<code>?

c# - 如何制作具有多个项目和不同输出的安装程序包?