0

我正在使用 c# 将字符串转换为 MD5 哈希。然后我使用 Java 将字符串转换为 MD5 哈希。我注意到即使对于相同的输入字符串,结果也不相同。

这是我的Java代码:

public String encrypt(String message)
{
    String digest = null;
    try
    {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] hash = md.digest(message.getBytes("UTF-8"));
        StringBuilder sb = new StringBuilder(2*hash.length);

        for(byte b : hash)
        {
            sb.append(String.format("%02x", b&0xff));
        }

        digest = sb.toString();
    }
    catch (Exception e)
    {
        //Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
    }

    return digest;

}

}

这是我的 C# 代码:

public static string Encrypt(string input)
    {
        Byte[] inputBytes = Encoding.UTF8.GetBytes(input);

        Byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(inputBytes);

        return BitConverter.ToString(hashedBytes);
    }

我可以更轻松地访问 Java 代码。有什么办法可以修改 Java 代码,使生成的哈希值与 C# 哈希值相同?

先感谢您。

4

2 回答 2

2

它们都产生相同的结果,但输出字符串格式不同

Java: 264fcf838c8e4b9d17c510cd5b8b9b78
C#: 26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78

Java 方面最简单的方法是稍微修改循环以添加破折号和大写十六进制BitConverter.ToString()添加;

boolean add_dash = false;
for(byte b : hash)
{
    if(add_dash)
        sb.append("-");
    add_dash = true;
    sb.append(String.format("%02X", b&0xff));
}

这将使两者都以格式生成 MD5 和

26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78

在 C# 端进行相反的操作更简单,只需将您的 return 更改为;

return BitConverter.ToString (hashedBytes).Replace("-", "").ToLowerInvariant();
于 2013-08-18T06:50:23.640 回答
0

我相信这是您正在寻找的答案:

StringBuilder hexString = new StringBuilder() 
for (byte b: hash) {
    String hex = Integer.toHexString(b & 0xFF);
    if (hex.length() == 1) {
        hexString.append("0");
    }
    hexString.append(hex.toUpperCase());
    hexString.append("-");
}

hexString.toString()应该产生与方法相同的结果BitConverter.ToString(byte[])

于 2013-08-18T06:56:16.017 回答