首页 > 解决方案 > 如何像在 PHP 示例中一样在 C# 中创建哈希?

问题描述

我必须将此 php 代码重写为 c#

$sign_params = ['name'=>"John", 'age'=>18];
$client_secret = 'test secret key';
ksort($sign_params); // Sort array by keys
$sign_params_query = http_build_query($sign_params); // Forming string like "param_name1=value&param_name2=value"
$sign = rtrim(strtr(base64_encode(hash_hmac('sha256', $sign_params_query, $client_secret, true)), '+/', '-_'), '='); // get hash code
return $sign;

这是我尝试的:

    public class apiHelper : MonoBehaviour
{
    const string client_secret = "test secret key";
    public static string checkSign(Dictionary<string, dynamic> fields)
    {
        //* sort by keys
        var list = fields.Keys.ToList();
        list.Sort();
        string sign_params_query = "";
        //* forming string like "param_name1=value&param_name2=value"
        foreach (var key in list)
        {
            sign_params_query = sign_params_query + key + "=" + fields[key];
            if (key != list.Last()) sign_params_query = sign_params_query + "&";
        }
        //* get hash code
        string sign = System.Convert.ToBase64String(GetHash(sign_params_query, client_secret));
        char[] charsToTrim = { '=' };
        return sign.Replace("+", "-").TrimEnd(charsToTrim);
    }
    static byte[] GetHash(string url, string key)
    {
        using (HMACSHA256 hmac = new HMACSHA256(Encoding.ASCII.GetBytes(key)))
        {
            byte[] data = hmac.ComputeHash(Encoding.UTF8.GetBytes(url));
            return data;
        }
    }

}

好吧,最后我得到了与 php 示例中不同的哈希值 ._。我做错了什么?这是我第一次使用加密或类似的东西

标签: c#phpunity3dcryptography

解决方案


好吧,带有特殊字符的字符串的问题。我必须使用 url_encode c# 等效来解决它。


推荐阅读