在Bash中格式化像.Net这样的SHA-1哈希

时间:2013-01-14 16:11:08

标签: .net bash hash formatting sha1

有人可以解释一下hash.ComputeHash函数在C#.Net中是如何工作的。

我试图在mac服务器上模仿bash中的.net hasing程序的行为,但结果却不一样了!

.Net代码:

 Byte[] z = System.Text.Encoding.UTF8.GetBytes("1B-F5");
 string myhash1 = BitConverter.ToString(hash.ComputeHash(z)); 
 string myhash2 = BitConverter.ToString(hash.ComputeHash(hash.ComputeHash(z)));

返回值:

myhash1 = "EF-83-00-69-6F-22-7C-1C-9C-84-C3-66-06-06-A5-12-A0-C7-91-B5"
myhash2 = "D3-5C-95-AD-2D-9E-5A-49-D0-D8-2B-4F-A5-F9-9A-6F-02-EA-8C-83"

问题是我无法在我的bash脚本中获得Second has值(已经经过双重哈希)。

击:

echo -n "1B-F5" | openssl sha1

给出正确的第一个哈希值(减去“ - ”字符) 然而

echo -n "1B-F5" | openssl sha1 | openssl sha1

提供完全不同的哈希值。我怀疑这是因为C#代码正在散列字节数组而不是字符串。

无论如何我可以在bash中获得相同的输出吗?

2 个答案:

答案 0 :(得分:2)

尝试将第二个哈希步骤转换为字符串,然后哈希。看看你得到了什么。请记住,你也可以对八位字符分隔符进行哈希处理。

byte[] z = System.Text.Encoding.UTF8.GetBytes("1B-F5");
string myhash1 = BitConverter.ToString(hash.ComputeHash(z)); 

z = System.Text.Encoding.UTF8.GetBytes(myhash1);
string myhash2 = BitConverter.ToString(hash.ComputeHash(z));

答案 1 :(得分:0)

如果您将结果与online SHA1 tools的结果进行比较 你会看到你正确地散列了字符串“1B-F5”。我怀疑你正在尝试散列一个双字节数组。

另一种可能性是您可能需要将第一个哈希的字节数组转换为字符串并将该字符串哈希