首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SHA256的Binance SHA256签名错误

使用SHA256的Binance SHA256签名错误
EN

Stack Overflow用户
提问于 2020-03-28 10:24:20
回答 2查看 4.5K关注 0票数 4

我尝试使用Binance ApiC#库连接到RestSharp。基于文档,我应该尝试这样的方法:

symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559 :queryString HMAC SHA256签名: linux$ echo "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559“"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j”openssl -sha256 -hmac“NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j”(stdin)= c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71 curl命令: (HMAC SHA256) linux$ curl -H“X:SHA256 -X POST tamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71

我尝试了许多方法和许多堆栈问题,但我找到了其他语言的解决方案,而不是c#。我所做的是基于:

代码语言:javascript
运行
复制
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();
    }

但是我得到了一个错误:这个请求的签名无效。我怎么才能修好它?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-04-11 15:49:42

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

代码语言:javascript
运行
复制
    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秘密。

需要注意的是,当您一步一步地进行调试时,Bad Request响应会导致请求失败,因为时间戳超出了recv窗口。

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

票数 8
EN

Stack Overflow用户

发布于 2022-11-13 17:48:50

Binance已经意识到了我们开发人员在签名方面存在的问题,事实上,他们在回购这里中添加了一个签名实用程序。如果像这样运行编译后的C#控制台程序,请检查代码并根据需要调整它:

代码语言:javascript
运行
复制
BinanceDotNet.exe signature

或者像这样:

代码语言:javascript
运行
复制
dotnet run signature

你会得到一个样本签名。

祝你好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60899886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档