C#.NET-使用HMAC -SHA512签名HTTP POST消息会在某些系统中产生不一致的结果



我正在建立一个与加密货币交易所互动的程序,以下达/出售订单等

为了使用Exchange的私有API方法,我必须在HTTP标头中包含一个符号,即邮寄消息主体,使用秘密键加密使用HMACSHA512。

下面的代码在我的系统中效果很好,但是我的一些用户报告说,当服务器尝试使用某些私有API方法时,服务器总是返回签名错误。

我试图在多个系统设置中重现该错误,但无济于事。

我想知道以下代码的任何部分是否容易在不同的系统设置中使用。

    public string SendQuery(string apiKey, string secretKey, string method, string[] param, string url)
    {
        // nonce
        string nonceStr = Utility.CurrentTimeMillis().ToString() + "0000000000";
        // generate the POST message
        string postString = "method=" + method + "&nonce=" + nonceStr;
        if (param != null) 
        {
            foreach (string item in param) postString += "&" + item;
        }            
        byte[] postData = Encoding.ASCII.GetBytes(postString);
        // sign POST message
        HMACSHA512 hMACSHA512 = new HMACSHA512(Encoding.ASCII.GetBytes(secretKey));
        byte[] sign = hMACSHA512.ComputeHash(postData);
        string signString = string.Empty;
        for (int i = 0; i < sign.Length; i++)
        {
            signString += sign[i].ToString("X2");
        }
        signString = signString.ToLower();   // must use lower case
        // generate headers
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Headers.Add("Key", apiKey);
        request.Headers.Add("Sign", signString);
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = postData.Length;
        request.KeepAlive = true;
        request.Proxy = null;
        request.Method = "POST";
        request.Timeout = 5000;
        string message = string.Empty;
        try
        {
            using (Stream st = request.GetRequestStream())
                st.Write(postData, 0, postData.Length);
            Stream responseStream = request.GetResponse().GetResponseStream();
            StreamReader objReader = new StreamReader(responseStream);
            string line = "";
            while (line != null)
            {
                line = objReader.ReadLine();
                if (line != null) message += line;
            }
        }
        catch (Exception ex)
        {
        }
        return message;
    }

所以回答我自己的问题,

事实证明,这个问题并不在于我的sendquery方法中,但是称其为double.tostring(" f8"(的函数来产生一个参数值,从而导致小数分离器字符变化,具体取决于本地格式。

例如:

double val = 1000.5;
string str = val.ToString("F8");

取决于格式将产生" 1000.50000000"或" 1000,50000000"。

因此,在使用double.tostring方法时,您必须提供IFORMATPROVIDER参数,或者只是使用肮脏但类似于工程的类似技巧,例如:

ToString("F8").Replace(",", ".");

最新更新