c#md5和php md5不匹配

时间:2017-04-27 06:53:03

标签: c# 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#,但我得到的结果完全不同,有没有人知道这两种语言并告诉我一些事情,非常感谢。

1 个答案:

答案 0 :(得分:0)

在PHP示例中,您使用&符号(&)添加每个部分,但是在C#版本中,您将添加除第一部分之外的所有部分:

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

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

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

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

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