C#MD5和PHP MD5不匹配



这是我的C#计算签名代码

using System;
using System.Text;
public class Test
{
    public static void Main()
    {
    string str;
    string syskey = "123456789";
    str = GenSignature(syskey,"foo","20170426001757");
    Console.WriteLine(str);
}
public static string GenSignature(string syskey,params string[] paramValues)
    {
        string source = "";
        for (int i = 0; i < paramValues.Length; i++)
        {
            if (!string.IsNullOrEmpty(paramValues[i]))
            {
                source += (string.IsNullOrEmpty(source) ? "" : "&") + paramValues[i];
            }
        }
        if (string.IsNullOrEmpty(source))
        {
            return "";
        }
        source +=  "&" + syskey;
        // Debug.WriteLine(source);
        using (System.Security.Cryptography.MD5 m = System.Security.Cryptography.MD5.Create())
        {
            byte[] hashData = m.ComputeHash(UTF8Encoding.UTF8.GetBytes(source));
            return BitConverter.ToString(hashData).Replace("-", "").ToUpper();
        }
    }
}

和PHP获取签名代码如下:

function getSignature() {
    $syskey = "123456789";
    $sysCode =  "foo";
    $timeStamp = "20170426001757";
    $str = "&".$sysCode."&".$timeStamp."&".$syskey;
    return strtoupper(md5($str));
}
echo getSignature();

我不太了解C#,但是我得到的结果完全不同,有人知道两种语言并告诉我一些东西,非常感谢。

在PHP示例中,您可以使用ampersand( &(预处理每个部分,但是在C#版本中,您会在每个部分中使用第一个部分:

source += (string.IsNullOrEmpty(source) ? "" : "&") + paramValues[i];

string.IsNullOrEmpty(source)将首次返回true,因为您最初将source设置为"",因此在字符串的开始时不会添加Ampersand。

将您的代码更改为此,它应该有效:

source += "&" + paramValues[i];

在线测试:https://dotnetfiddle.net/khoftl

最新更新