Java MD5 编码器与 C# MD5CryptoServiceProvider 不匹配

标签 java c# md5 encode

我正在尝试生成 C# MD5CryptoServiceProvider 来编码字符串,并生成 Java MessageDigest.getInstance("MD5") 来编码字符串,但两个输出不同。 stackoverlflow 上已经提供了很多示例,但仍然停留在某些地方。

以下是我的 C# 代码:

MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
    Byte[] hashedDataBytes = null;
    UTF8Encoding encoder = new UTF8Encoding();

    hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes("NSI#1234@"));
    string strPassword = string.Empty;
    foreach (byte b in hashedDataBytes)
    {
        strPassword = strPassword + b.ToString();
    }
    return strPassword;

C# 代码是卡住代码,我无权更改此代码。

以下是我的Java代码:

MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest("NSI#1234@".getBytes("UTF-8"));
String hash = new BigInteger(1, digest).toString();
System.out.println(hash);

C# 代码输出:158163028351382321031971922721528189209213

Java代码输出:210864369951346339831795420458152481237

C# 生成 42 个数字,java 生成 39 个数字。如果我更改 new BigInteger(1,digest).toString(8) 的值,它会生成 43 个数字,如果我更改 new BigInteger(1,digest).toString(9) code> 它生成 41 号。

最佳答案

无论是 C# 代码还是 Java 代码都不是将哈希值转换为字符串的好方法。我强烈怀疑在这两种情况下您都有相同的字节,但您以不同的方式将它们转换为字符串。

您的 C# 代码只是将每个字节转换为其十进制表示形式。 (它也是通过重复的字符串连接来实现的。讨厌。)您的 Java 代码将忽略前导 0,并且当前使用十进制。您可以调用 toString(16) 来生成十六进制,但它仍然会忽略前导零。

如果你确实想要十六进制,你可以使用 BitConverter.ToString(byte[])在 .NET 中获取十六进制表示形式,尽管您可能希望删除它放置在每个字节之间的 - ;在Java中有各种可用的库,例如Apache Commons Codec ( Hex ) 或 Guava (BaseEncoding.base16())。或者使用 Stack Overflow 上 Java 十六进制编码的许多答案之一中的一些代码,such as this one .

或者,您可以使用 Base64 - 同样,有多个选项可用,例如 .NET 中的 BitConverter.ToBase64Stringiharder public domain library对于 Java。

如果您的 C# 代码确实被卡住了(跑到山上!),那么等效的(嗯,稍微干净一点)Java 代码将类似于:

StringBuilder builder = new StringBuilder();
for (byte b : digest) {
    builder.append(b & 0xff); // Convert signed to unsigned
}

我还建议您使用StandardCharsets.UTF_8如果您使用的是 Java 7+。

但如果可以的话,我强烈建议修复 C# 代码。即使您处于“代码卡住”状态,也可能不会阻止您修复重要的错误 - 并且如果您存储这些值,那么现在修复它会比以前容易得多稍后会这样做。

关于Java MD5 编码器与 C# MD5CryptoServiceProvider 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28216389/

相关文章:

java - 在for循环中设置数组内容

java - 显示来自 REST API 的 Hashmap json,作为 Angular 5 中的表

c# - 如何在 ASP.NET Web 应用程序中连接到 MySql 数据库?

Java,将文件导入MD5消息摘要

php - 如何实现一个密码的sha 512,md5和salt加密

java - 通过 HTTPS 403 禁止的 Websocket

java 默认列表模型

c# - 使用 C# Lambda 分割字符串和搜索值

c# - 无法建立连接,因为目标机器主动拒绝它为什么?

md5 - MD5 中的碰撞概率