2

Java 代码应具有与 C# 代码相同的功能。这段代码是一样的吗?

这是 C# 代码中的代码:

byte[] hashBytes;
UnicodeEncoding encoding = new UnicodeEncoding();
hashBytes = encoding.GetBytes(inputstr.Text.ToUpper().Trim());

SHA1 sha1 = new SHA1CryptoServiceProvider();

byte[] cryptPassword = sha1.ComputeHash(hashBytes);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
SHA1.Text = enc.GetString(cryptPassword);
outputstr.Text = Convert.ToBase64String(cryptPassword);

这是 Java 移植代码,但我得到不同的输出:

byte[] pwBytes = new String("password".toUpperCase().getBytes(), "UTF-16").getBytes();

MessageDigest md = null;
md = MessageDigest.getInstance("SHA-1");
byte[] sha1pw = md.digest(pwBytes);

final BASE64Encoder encoder = new BASE64Encoder();
String encodedPw = encoder.encode(sha1pw);

Java 代码计算encodedPw 的方式应该与C# 代码计算outputstr.Text 的方式相同。

很抱歉,我无法运行 C# 代码来提供示例。Java 代码将“密码”哈希为oghZbO1T3U/eu3POLIIQweZ/gvQ=.

4

1 回答 1

1

UnicodeEncoding在 c# 中默认使用UTF-16 little endian,而UTF-16在 java 中默认使用 big endian。所以在Java中你需要:

byte[] pwBytes = "password".toUpperCase().getBytes("UTF-16LE");
于 2013-05-31T00:09:19.753 回答