2013-10-31 13 views
7

Nowy uwierzytelnienie bitstamp mówi co następuje:Bitstamp - nowy uwierzytelnianie w C# - podpis

Signature is a HMAC-SHA256 encoded message containing: nonce, client ID and API key. The HMAC-SHA256 code must be generated using a secret key that was generated with your API key. This code must be converted to it's hexadecimal representation (64 uppercase characters).Example (Python): message = nonce + client_id + api_key signature = hmac.new(API_SECRET, msg=message, digestmod=hashlib.sha256).hexdigest().upper()

Źródło: link

Mam poniższy kod, żeby dodać nowy podpis (i inne parametry):

public void AddApiAuthentication(RestRequest restRequest) 
    { 
     var nonce = DateTime.Now.Ticks; 
     var signature = GetSignature(nonce, apiKey, apiSecret, clientId); 

     restRequest.AddParameter("key", apiKey); 
     restRequest.AddParameter("signature", signature); 
     restRequest.AddParameter("nonce", nonce); 

    } 

    private string GetSignature(long nonce, string key, string secret, string clientId) 
    { 
     string msg = string.Format("{0}{1}{2}", nonce, 
      clientId, 
      key); 

     return ByteArrayToString(SignHMACSHA256(secret, StrinToByteArray(msg))).ToUpper(); 
    } 
    public static byte[] SignHMACSHA256(String key, byte[] data) 
    { 
     HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key)); 
     return hashMaker.ComputeHash(data); 
    } 

    public static byte[] StrinToByteArray(string str) 
    { 
     byte[] bytes = new byte[str.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
     return bytes; 
    } 

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

I wtedy ten błąd:

{"error": "Invalid signature"}

Ktoś ma pojęcie, jaki może być problem? Sprawdziłem moje parametry 100 razy, a te nie są złe. Może ktoś ma działający kawałek kodu (w języku C#) dla nowego uwierzytelnienia?

UPDATE

Abhinav rację, metoda StringToByteArray było źle (nie tylko literówka: P) kod pracy wynosi:

public static byte[] StrinToByteArray(string str) 
    { 
     return System.Text.Encoding.ASCII.GetBytes(str); 
    } 
+0

Ciekawy, jakiego stosu używasz do RESTU? – LamonteCristo

+1

@ makerofthings7 Używam RESTSharp. – Julian

+0

@Julian Trudno mi zrozumieć algorytm bitstamp, czy mógłbyś mi pomóc? http://stackoverflow.com/questions/21612185/restsharp-bitstamp-authentication-fails – Freddy

Odpowiedz

5

Używasz str.ToCharArray() w StrinToByteArray która jest niepoprawna (poprawne TYLKO w przypadku używania w tym samym systemie). Musisz użyć kodowania ASCII lub czegoś podobnego.

+2

Jesteś moim bohaterem! Mała zmiana (patrz aktualizacja) sprawiła, że ​​kod zadziałał. Mógłbym też użyć UTF8 zamiast ASCII, które zauważyłem po testach. – Julian