[英]SHA256 hash calculation
对于我的雇主,我必须为他们下载的某些文件的网络应用程序客户提供校验和。
我想向用户提供他们的客户端工具也可能生成的哈希值,因此我一直在比较在线哈希工具。 我的问题是关于它们的散列形式,因为它们不同,奇怪的是。
经过快速搜索,我测试了5:
输入值'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.