在Java和C#中计算SHA-1哈希

在Java和C#中计算SHA-1哈希

我正在尝试在C#应用程序中复制Java应用程序的逻辑。 部分原因是生成密码的SHA-1哈希。 不幸的是,我无法从Java和C#获得相同的结果。

 C#输出:64 0a b2 ba e0 7b ed c4 c1 63 f6 79 a7 46 f7 ab 7f b5 d1 fa
 Java输出:164 10a b2 ba e0 17b ed c4 c1 163 f6 179 a7 146 f7 ab 17f b5 d1 fa 

为了试图弄清楚发生了什么,我一直在Eclipse和Visual Studio中使用Debugger。

 1.检查byte []键的值:

     Java:{84,101,115,116}
     C#:{84,101,115,116}

 2.检查byte [] hash的值:

     Java:{100 10 -78 -70 -32 123 ...}
     C#:{100 10 78 186 224 123 ...}

我已经阅读了关于这个主题的其他post,主要是指输入字符串编码,但这些似乎没有帮助我。 我的猜测是这与有符号和无符号字节有关,但我在这条轨道上没有取得多大进展。 任何帮助将不胜感激。

谢谢,

Karle


Java版本:

public void testHash() { String password = "Test"; byte[] key = password.getBytes(); MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] hash = md.digest(key); String result = ""; for ( byte b : hash ) { result += Integer.toHexString(b + 256) + " "; } System.out.println(result); } 

C#版本:

 public void testHash() { String password = "Test"; byte[] key = System.Text.Encoding.Default.GetBytes(password); SHA1 sha1 = SHA1Managed.Create(); byte[] hash = sha1.ComputeHash(key); String result; foreach ( byte b in hash ) { result += Convert.ToInt32(b).ToString("x2") + " "; } Console.WriteLine(result); } 

在Java版本中,不要使用b + 256 ; 相反,使用b & 255 。 SHA-1部分很好,这只是打印输出的问题。 Java的“ byte ”类型是有符号的:它返回介于-128和127之间的值。要获得相应的无符号值, 只有在值为负时才必须添加256。

一个按位AND与255(即“ & 255 ”所做的)操作正确的转换,在二进制级别,该值是将值截断为其8个最低有效位。

你的问题和答案对我来说非常有用,但是我注意到当密码生成字符“0”时,生成的哈希码是不同的,所以我改变了一些代码(在Java中)。

 for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(hash[i]); if (hex.length() == 1) hex = "0" + hex; hex = hex.substring(hex.length() - 2); result += hex; }