如何在 Java 中获取与 C# 中相同的 MD5 字符串



我有 C# 代码,它从String生成 MD5 编码的byte[],然后将此byte[]转换为String。C# 代码是

byte[] valueBytes = (new UnicodeEncoding()).GetBytes(value);
byte[] newHash = (new MD5CryptoServiceProvider()).ComputeHash(valueBytes);

我需要在 Java 中获得相同的结果。我正在尝试这样做

Charset utf16 = Charset.forName("UTF-16");
return new String(DigestUtils.md5(value.getBytes(utf16)), utf16);

该代码使用 Apache Commons 编解码器库进行 MD5 计算。我使用的是 UTF16 字符集,因为我在其他 SO 问题中读到过 C# 的UnicodeEncoding默认使用它。

所以代码片段看起来像是做同样的事情,但是当我传递字符串byndyusoft2014时,C# 给了我hV7u6mQYRgBXXF9jOWWYJg==,Java 给了我﹡둛뭶魙ꇥ늺ꢑ。我尝试过UTF16LE和UTF16BE作为字符集,但没有运气。

有谁知道我做错了什么?

我认为是因为java将字符串解码为带有utf-8的byte[],但C#不是。所以java和C#对不同的字节数组进行编码,然后得到不同的结果。您可以使用 utf-8 在 c# 处将字符串解码为 byte[],并查看结果。像下面的代码:

UTF8Encoding utf8 = new UTF8Encoding();
byte[] bytes=utf8.GetBytes("byndyusoft2014");
byte[] en=(new MD5CryptoServiceProvider()).ComputeHash(bytes);
Console.WriteLine(Convert.ToBase64String(en));

和 Java 代码:

byte[] en = DigestUtils.md5Digest("byndyusoft2014".getBytes());
byte[] base64 = Base64Utils.encode(en);
System.out.println(new String(base64));

当然,在您的描述中,C#的结果喜欢用base64编码,所以java应该用base64编码字节数组。 它们的结果与swPvmbGDI1GbPKQwL9knjQ==相同

DigestUtilsBase64Utils是春季库中MD5BAS64的一些实现

事实证明,主要区别并没有出现在我的原始代码片段中 - 它是从 MD5 编码byte[]String的转换。您需要使用 Base64 才能获得最终结果。这是 Java 中的工作代码片段

Charset utf16 = Charset.forName("UTF-16LE");
return new String(Base64.encodeBase64(DigestUtils.md5(value.getBytes(utf16))));

使用此代码,我得到的结果与 C# 相同。谢谢大家的好提示!

最新更新