PHP和C#中的不同MD5哈希值

时间:2018-05-29 10:50:45

标签: c# php hash cryptography

如果我改变输入字符串,为什么哈希变得不同?

我的C#代码是:

public static string CreateMD5(string strInput)
    {
        using (MD5 md5 = MD5.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(strInput);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            string hashedString = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
            return hashedString;
        }
    }

在PHP中,我使用md5()函数。这是一个在线服务,所以我没有源代码;我只是使用该网站来匹配结果。

如果我有这个字符串:

test-server::7250406f7c43524545f794ff50dfd15b

哈希是相同的:20202421c846813960404af7dd36c146。但是,如果我将字符串扩展为此(带编码字符):

test-server::7250406f7c43524545f794ff50dfd15b::name=%D0%98%D0%BD%D0%B5%D1%81%D1%81%D0%B0

现在哈希值不同:3db825e09eae0a83db535fda7f5ee5b5ee1ae334e4bdeceb54caab15555f2f40

为什么会这样?

1 个答案:

答案 0 :(得分:4)

哈希值ee1ae334e4bdeceb54caab15555f2f40test-server::7250406f7c43524545f794ff50dfd15b::name=Инесса上的MD5哈希值。此输入是test-server::7250406f7c43524545f794ff50dfd15b::name=%D0%98%D0%BD%D0%B5%D1%81%D1%81%D0%B0的URL解码版本。

您的C#代码片段在未解码的版本上执行MD5。 PHP默认解码GET,因此为了获得相同的结果,您需要对设置为PHP脚本的值进行双重编码。

见这里,https://3v4l.org/rK7fi(在线PHP代码实现):

  

GET变量通过urldecode()传递。

http://php.net/manual/en/reserved.variables.get.php

或者,如果在对C#中的值进行URL编码之前对MD5值进行编码,则系统应返回相同的哈希值。