gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:00:09 26 4
gpt4 key购买 nike

我正在尝试生成 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com