【问题标题】:C# MD5 hash not matches Java / PHP MD5 hashC# MD5 哈希与 Java/PHP MD5 哈希不匹配
【发布时间】:2014-05-19 08:26:47
【问题描述】:

我的练习是将administration-backend 从 php 移植到 .net。

后端与用 java 编写的应用程序通信。

有些东西与 md5-hashes 相比,在 php 和 java 中 md5 哈希值是相等的。

我无法在 java 应用程序中更改 md5 哈希码,因为那样的话,超过 10k 的客户卡将无法使用。

我的问题是,后端已移植,现在新后端 (.net) 和 java 应用程序之间的通信。

我的 .net md5-hash 代码返回的哈希值与 java 代码不同。

java:

    public static String getMD5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");

            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            String hashtext = number.toString(16);


            // Now we need to zero pad it if you actually want the full 32 chars.
            while (hashtext.length() < 32)
                hashtext = "0" + hashtext;
            return hashtext;
        }
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

还有我的 .net 代码:

        public String hashMD5(String wert)
    {


        byte[] asciiBytes = ASCIIEncoding.UTF8.GetBytes(wert);
        byte[] hashedBytes = MD5CryptoServiceProvider.Create().ComputeHash(asciiBytes);
        string hashedString = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();

        return hashedString;
    }

我的java代码返回bb27aee4:

46d5acfcd281bca9f1df7c9e38d50576

我的 .net 代码返回:

b767fe33172ec6cbea569810ee6cfc05

我不知道我要做什么......

请提前帮助和感谢。

【问题讨论】:

  • 首先,确保在 java (input.getBytes("UTF-8")) 和 C# 中都使用 UTF-8(ASCIIEncoding.UTF8.GetBytes(wert) 看起来很可疑,不应该是 Encoding.UTF8.GetBytes() 来编译吗?)。

标签: c# java .net hash md5


【解决方案1】:

不是 MD5 哈希生成器的问题

bb27aee4 的 MD5 哈希:46d5acfcd281bca9f1df7c9e38d50576 &
BB27AEE4 的 MD5 哈希:b767fe33172ec6cbea569810ee6cfc05

所以基本上在 .NET 中,您正在为 BB27AEE4 而不是 bb27aee4 生成 MD5 哈希

所以检查代码中的错误

祝你好运

【讨论】:

    【解决方案2】:

    您从哈希中看到不同结果的原因是用于字符串的编码不同。在您的 .NET 代码中,您明确指定 UTF8,而没有 保证 您的 Java 代码也是如此;它很可能使用 ASCII,这会导致生成不同的哈希值。

    如果您在 .NET 和 Java 代码中明确指定相同的编码,您最终也会得到相同的 MD5 哈希值。

    【讨论】:

    • 虽然一般来说这是一个有效点,但它并不能解释测试输入 bb27aee4 的差异,这将导致几乎任何编码(EBCDIC 除外)的相同字节序列。跨度>
    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2013-08-20
    • 2019-10-10
    • 1970-01-01
    • 2011-09-12
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多