【问题标题】:C# equivalent to Java's DigestUtils.md5Hex(String)?C# 相当于 Java 的 DigestUtils.md5Hex(String)?
【发布时间】:2009-10-08 21:31:04
【问题描述】:

有没有现成的C#相当于Java的DigestUtils.md5Hex(String)?我的 Java 生锈了,但我可以说 DigestUtils 是 Apache Commons Codec 包的一部分,而 md5Hex(String) 方法本质上是使用 MessageDigest.getInstance("MD5")。

(一个相关的花絮,Java和C#代码都使用UTF8。)


在最简单的测试中,我已经排除了我使用的 Java 和 C# 算法之间的任何差异。这意味着我的问题在其他地方。但是,为了记录,这两段代码产生了相同的结果:(谢谢,Alex。)

Java:

private static void printMd5Hex(String data) {
    System.out.println(DigestUtils.md5Hex(data));
}

C#:

private static void printMd5Hex(string data)
{
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    byte[] dataHash = md5.ComputeHash(Encoding.UTF8.GetBytes(data));
    StringBuilder sb = new StringBuilder();
    foreach (byte b in dataHash)
    {
        sb.Append(b.ToString("x2").ToLower());
    }
    Console.WriteLine(sb.ToString());
}

为了正确解决这个问题,我的问题的根源与用于创建被散列的“数据”的格式字符串中的 Java 代码中的错误有关。本质上:

string dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s";
string dataToHash = String.Format(dataFormatString, ...);

问题在于第 12 个参数。它缺少一个 $,这意味着数据被空格填充到最少 12 个字符,使用第一个参数作为要格式化的数据。可悲的是,编写该错误的开发人员不再在这里工作,因此剥夺了我用手捂住他喉咙的机会。

【问题讨论】:

    标签: c# java md5


    【解决方案1】:

    你想用c#计算md5吗?

    System.Security.Cryptography.MD5CryptoServiceProvider x =
        new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
    bs = x.ComputeHash(bs);
    System.Text.StringBuilder s = new System.Text.StringBuilder();
    foreach (byte b in bs)
    {
       s.Append(b.ToString("x2").ToLower());
    }
    password = s.ToString();
    

    【讨论】:

    • 感谢@Alex 和/或 jitter。我可以并且已经使用“System.Security.Cryptography.MD5”哈希算法在 C# 中成功计算了 md5。但是,我尝试复制 DigestUtils.md5Hex(String) 行为的方式不会产生相同的哈希值。我要试试这个。
    • 我现在已经尝试了上述方法,使用 MD5CryptoServiceProvider.ComputeHash(byte[]),我怀着复杂的心情报告它生成的哈希值与我现有的代码完全相同。不幸的是,它与 DigestUtils.md5hex(String) 的输出不匹配。
    • 这个例子在字符串的 UTF8 编码上计算 md5。您可能需要使用 Unicode 吗?
    • DigestUtils 有计算 byte[] 上 md5 的方法。与 .Net md5 提供程序相同。在相同的输入上运行它们并比较输出以查看问题是在提供程序中还是在将字符串转换为字节时。
    猜你喜欢
    • 2011-06-29
    • 2010-09-24
    • 2023-04-06
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2014-09-29
    • 2011-01-21
    相关资源
    最近更新 更多