Недопустимая подпись с вызовами Bittrex API в C#

Я пытаюсь получить доступ к остаткам своего кошелька в Bittrex через вызовы API Bittrex, но по какой-то причине получаю ответное сообщение INVALID_SIGNATURE.

Я использую эти функции для создания подписи:

Получить один раз

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

    return ms.ToString();
}

Получить подпись

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 делает с теми же url и nonce и т. д., но не может получить доступ к моим балансам. Когда я делаю вызов, который не требует никаких подписей, он работает просто отлично... Совершенно не уверен, что я делаю не так.


person misthema    schedule 26.06.2015    source источник


Ответы (2)


Получил ответ из другого места. Похоже, моя кодировка была неправильной, и из-за этого она не работала (хотя я думал, что пробовал другие кодировщики...).

Правильная кодировка — 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;
}

Сейчас проблема решена и все работает как надо. :-)

person misthema    schedule 05.07.2015

Посмотрите на эту функцию, она отлично работает для меня и проверена.

function 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

person Tarun Gupta    schedule 18.07.2018