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

标签 java c#

我有 C# 代码,它从 String 生成 MD5 编码的 byte[],然后将此 byte[] 转换为 字符串。 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 Codec 库进行 MD5 计算。我使用 UTF16 字符集是因为我在其他问题中读到 C# 的 UnicodeEncoding 默认使用它。

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

有人知道我做错了什么吗?

最佳答案

我认为是因为 java 将字符串解码为 utf-8 到 byte[] ,但C#不是。所以java和C#对不同的字节数组进行编码,然后得到不同的结果。您可以在c#中使用utf-8将字符串解码为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== 相同

DigestUtilsBase64UtilsMD5的一些实现和BAS64在 Spring 库中

关于java - 如何在 Java 中获得与 C# 中相同的 MD5 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922110/

相关文章:

java - 在JAVAFX中将字符串行添加到TableView

java - 在 Spring Boot 中使用 JPA 从具有 OneToMany 关系的实体中删除对象

java - 如何制作jar包

c# - 抽象类继承需要构造函数的泛型类型

java - 断言集合包含自定义类的对象,它不会覆盖 equals/hashcode

java - 忽略 Thymeleaf 中 href 中的空参数

c# - EF 迁移中的自定义代码执行

c# - 格式化程序反序列化给出 : End of Stream encountered before parsing was completed

c# - 如何在 WTelegramClient 中更改我的头像

c# 泛型方法崩溃