对于我的雇主,我必须向网络应用程序的客户介绍他们下载的某些文件的校验和。
我想向用户展示他们的客户端工具也可能生成的哈希,因此我一直在比较在线哈希工具。我的问题是关于它们的散列形式,因为它们有所不同,很奇怪。
快速搜索后,我用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)
UPDATE2:也许我应该稍微扩展一下这个问题,因为它可能没有得到解释,抱歉。我想我要问的更多的是可用性问题,而不是技术问题;我应该提供具有不同行结尾的所有哈希吗?或者我应该坚持一个?如果他们有不同的计算哈希的方式,客户可能会打电话给我的公司担心他们的文件被改变了。这通常是如何解决的?
答案 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);