C#中使用Bittrex API调用的签名无效

时间:2015-06-26 12:21:25

标签: c# api signature hmac

我试图通过Bittrex的API调用访问Bittrex中的钱包余额,但出于某种原因,我收到的回复消息是INVALID_SIGNATURE

我使用这些函数来创建签名:

GetNonce

private String GetNonce()
{
    long ms = (long)((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds);

    return ms.ToString();
}

GetApiSignature

private String GetApiSignature(String key, String message)
{
    using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(key)))
    {
        hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(message));
        return string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2")).ToArray());
    }       
}

以下是我“编译”我的电话的方式:

public String ApiQuery(String requestUrl)
{

    url = new Uri(requestUrl);
    webreq = WebRequest.Create(url);

    signature = GetApiSignature(apiSecret, requestUrl);
    webreq.Headers.Add("apisign", signature );

    webresp = webreq.GetResponse();
    stream = webresp.GetResponseStream();
    strRead = new StreamReader(stream);

    String rtn = strRead.ReadToEnd();

    return rtn;
}

我获得的python API wrapperurlnonce等签名相同,但无法访问我的余额。当我做一个不需要任何签名的电话时,它工作得很好......根本不确定我做错了什么。

2 个答案:

答案 0 :(得分:6)

从其他地方得到答案。看起来我的编码是错误的,因为它没有工作(虽然我以为我尝试过其他编码器......)。

正确的编码是ASCII,而我使用的是UTF-8。

这是我得到的功能:

private string genHMAC(string secret, string url)
{
    var hmac = new HMACSHA512(Encoding.ASCII.GetBytes(secret));
    var messagebyte = Encoding.ASCII.GetBytes(url);
    var hashmessage = hmac.ComputeHash(messagebyte);
    var sign = BitConverter.ToString(hashmessage).Replace("-", "");

    return sign;
}

问题现在已经解决,一切正常。 : - )

答案 1 :(得分:1)

看看这个功能,它对我来说工作正常并经过测试。

函数calculateSign(url){     var sign = crypto.createHmac('sha512',constants.bittrexCredentials.SECRET);

sign = sign.update(url,'ascii');
sign = sign.digest('hex');
return sign;

} 完整的实现仓库:https://github.com/tarun1475/Nodejs-Bittrex-Client