我正在使用 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# 哈希值相同吗?
提前谢谢您。
最佳答案
它们产生相同的结果,但输出字符串格式不同
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();
关于c# - Java MD5 哈希与 C# 哈希不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18296375/