对于我的雇主,我必须向网络应用程序的客户展示他们下载的某些文件的校验和。
我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为它们不同,这很奇怪。
快速搜索后,我测试了 5 个:
- http://www.convertstring.com/Hash/SHA256
- http://www.freeformatter.com/sha256-generator.html#ad-output
- http://online-encoder.com/sha256-encoder-decoder.html
- http://www.xorbin.com/tools/sha256-hash-calculator
- 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/