gpt4 book ai didi

Java MD5 哈希与 .NET 哈希不匹配

转载 作者:行者123 更新时间:2023-12-04 05:41:11 24 4
gpt4 key购买 nike

我有一个用 C# 编写的 Web 服务,用于处理一些值验证。我需要在其中检查调用 Java 客户端中生成的 MD5 哈希。

Java 客户端以这种方式生成散列

Charset utf8Charset = Charset.forName("UTF-8");

byte[] bytesOfPhrase = phrase.getBytes(utf8Charset);
MessageDigest md = MessageDigest.getInstance("MD5");

byte[] thedigest = md.digest(bytesOfPhrase);
this._AuthenticationToken = new String(thedigest, utf8Charset);

C# 网络服务以这种方式生成其 has:

private static string HashString(string toHash)
{
MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();

byte[] hashedBytes = md5Provider.ComputeHash(_StringEncoding.GetBytes(toHash));
return Convert.ToBase64String(hashedBytes);
}

我在 Java 代码中尝试了几种字符集,但它们都没有产生与 Java 产生的字符串相似的字符串。在每次调用期间使用相同的硬编码值(这意味着我已经对参数进行了硬编码,因此散列应该匹配)仍然会产生一个奇怪的 Java 字符串。

散列值的 C# 示例:

6wM7McddLBjofdFJ3rU6/g==

我会发布 Java 生成的字符串示例,但它有一些非常奇怪的字符,我认为我不能将其粘贴到这里。

我做错了什么?

最佳答案

这基本上是损坏的代码:

// Badly broken
byte[] thedigest = md.digest(bytesOfPhrase);
this._AuthenticationToken = new String(thedigest, utf8Charset);

永远,永远,永远不要尝试通过将任意二进制数据传递给 String 构造函数来对其进行编码。 始终使用 base64、十六进制或类似的东西。 Apache Commons Codec有一个 Base64 编码器,或者这个 public domain version有一个稍微更令人愉快的 API。

等效的 C# 将是:

// Equally broken
byte[] hashedBytes = md5Provider.ComputeHash(Encoding.UTF8.GetBytes(toHash));
return Encoding.UTF8.GetString(hashedBytes);

MD5 摘要生成的二进制数据实际上是有效的 UTF-8 字节序列的可能性有多大?

还有两点需要注意:

  • 您可以在 .NET 中使用 MD5 类更简单地获取 MD5 哈希值:

    byte[] hash;
    using (MD5 md5 = MD5.Create())
    {
    hash = md5.ComputeHash(bytes);
    }
    // Use hash

    注意使用 using 语句来处理之后的实例。我对此的主要偏好是,它比 MD5CryptoServiceProvider 更容易记住、阅读和键入 MD5 :)

  • 你还没有说清楚_StringEncoding 是什么,但是代码实际上应该只是使用Encoding.UTF8 来匹配Java。

关于Java MD5 哈希与 .NET 哈希不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5406773/

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