使用C#的Binance API HMAC SHA256签名错误

时间:2020-03-28 10:24:20

标签: c# sha256 binance

我尝试使用Binance ApiC# lib连接到RestSharp。基于documents,我应该尝试以下方法:

queryString:symbol = LTCBTC&side = BUY&type = LIMIT&timeInForce = GTC&quantity = 1&price = 0.1&recvWindow = 5000&timestamp = 1499827319559

HMAC SHA256签名:

[linux] $ echo -n “ symbol = LTCBTC&side = BUY&type = LIMIT&timeInForce = GTC&quantity = 1&price = 0.1&recvWindow = 5000&timestamp = 1499827319559” | openssl dgst -sha256 -hmac “ NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j” (标准输入)= c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71 curl 命令:

(HMAC SHA256)[linux] $ curl -H“ X-MBX-APIKEY: vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A“ -X 开机自检 https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71

我尝试了许多方法和许多堆栈问题,但是我找到了其他语言(不是c#)的解决方案。 我根据以下内容完成此操作:thisthis

public string GetAccountInfo()
    {
        long timeStamp = GetTimestamp();
        var request = new RestRequest("api/v3/account");
        request.AddHeader("X-MBX-APIKEY", ApiKey);
        request.AddParameter("timestamp", timeStamp, ParameterType.QueryString);
        request.AddParameter("recvWindow", RecvWindow, ParameterType.QueryString);
        request.AddParameter("signature", GetSignature(request.Parameters), ParameterType.QueryString);
        return Client.Get(request).Content;
    }
private long GetTimestamp()
    {
        return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
    }

    private string GetSignature(List<Parameter> parameters)
    {
        var signature = "";
        if(parameters.Count > 0)
        {
            foreach (var item in parameters)
            {
                if(item.Name != "X-MBX-APIKEY")
                    signature += $"{item.Name}={item.Value}&";
            }
            signature = signature.Substring(0, signature.Length - 2);
        }
        byte[] keyBytes = Encoding.Unicode.GetBytes(ApiSecret);
        byte[] valueBytes = Encoding.Unicode.GetBytes(signature);
        return HashEncode(HashHMAC(keyBytes, valueBytes));
    }

    private static byte[] HashHMAC(byte[] key, byte[] message)
    {
        var hash = new HMACSHA256(key);
        return hash.ComputeHash(message);
    }

    private static string HashEncode(byte[] hash)
    {
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }

但是我收到此错误:此请求的签名无效。我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:1)

以下是签名生成的工作示例:

    public static string CreateSignature(string queryString, string secret)
    {

        byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
        byte[] queryStringBytes = Encoding.UTF8.GetBytes(queryString);
        HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);

        byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);

        return BitConverter.ToString(bytes).Replace("-", "").ToLower();
    }

queryString是您在查询中传递的参数字符串,例如timestamp=1586620030079
secret是您的api秘密。

要注意的重要一点是,由于时间戳超出了recv窗口的范围,当您逐步进入调试时,请求失败,并返回Bad Request响应。

您还可以发现此SDK非常有用,至少作为工作代码示例:https://github.com/nathan-alexander/csharp-binance-api