Jump to content

Invalid Signature bei POST-Requests (Bitcoin.de API)


cocoahead
 Share

Recommended Posts

Hallo zusammen,

 
derweil entwickle ich eine App für macOS, um mithilfe der API traden zu können.
 
Reine GET- und DELETE-Anfragen, d.h. showRates, showOrderbook, showMyOrders usw. und auch remove_order, funktionieren auch schnell und zuverlässig. Lediglich mit den POST-Anfragen erhalte ich stets einen Invalid-Signature-Fehler (Error code 5).
 
Zum Vergleich zog ich eine php-Implementation der Bitcoin.de-API heran: mit ihr habe ich keine Schwierigkeiten, neue Order (createOrder) anzulegen. 
 
Gebe ich nun sowohl der php- als auch meiner Implementation zur Berechnung der Signatur die identischen Werte (apiKey, apiSecret, identische nonce, identische Parameter für die zu erzeugende Order) vor, erhalte ich auch exakt gleiche Werte für hash und hmac. 
 
Dies ist für mich etwas irritierend - identische Ausgangswerte ergeben identisch Ergebnisse der Berechnungen ergeben unterschiedliche Serverantworten … 
 
Etwas ratlos frage ich hier freundlich in die Runde, ob irgendwer mal über ähnliche Probleme stolperte. 
 
Beste Grüße
Peter
Edited by cocoahead
Link to comment
Share on other sites

Hallo Axoim,

 

vielen Dank für deine schnelle Antwort. In die Richtung hatte ich auch überlegt - und augenscheinlich kann es ja fast nichts™ anderes mehr sein - wenngleich mich das wundert. Ich nutze für GET/DELETE/POST die identische Methode zum Erstellen des urlRequests: straight forward ein Request-Object holen und Werte setzen und dann via NSURLSession absenden.

 

Mal schauen, was ich herausfinden kann. 

 

Beste Grüße

Peter

 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:httpMethod];

[request addValue:api_key forHTTPHeaderField:@"X-API-KEY"];

[request addValue:nonce   forHTTPHeaderField:@"X-API-NONCE"];

[request addValue:hmac    forHTTPHeaderField:@"X-API-SIGNATURE"];

Edited by cocoahead
Link to comment
Share on other sites

  • 1 year later...

Hey, ich stehe vor selbigen Problem. Allerdings mit einer etwas anderen methode.

Einen GET Request zu senden wie den Kurs abzufragen funktioniert. Nur leider bei Post Parameter stoße ich auf Probleme. Dort erhalte ich selbige Fehlermeldung. Ich denke auch das irgendwas bei mir noch fehlt.

Zum testen der Paramter habe ich das folgende Beispiel genau nachberechnet. sowohl der codierte MD5 Post parameter sowie auch die Signatur stimmen mit dem Beispiel überein. In der Logdatei auf Bitcoin.de kann ich sehen das der Request zwar ankommt, der Postparameter jedoch nicht mit übergeben wird. Das ist wohl das derzeitige Problem bei mir. Fehlt mit bei der Übergabe vielleicht noch hein Header?

POST-Parameter:
{
    'type'     : 'buy',
    'max_amount' : 5.3,
    'price'   : 255.50
}

api_key:     'MY_API_KEY' // Entspricht dem eigenen API-Key
nonce:       1234567 // Das für den aktuellen Request verwendete Nonce
api_secret:  'MY_API_SECRET' // Entspricht dem eigenen API-Secret
http_method: 'POST'
uri:         'https://api.bitcoin.de/v1/orders'

Schritt 1: Aufsteigendes Sortieren der POST-Parameter anhand ihres Namens¹

{
    'max_amount' : 5.3,
    'price'   : 255.50
    'type'     : 'buy',
}

Schritt 2: Einen validen URL-encoded Query-String aus den POST-Parametern generieren¹

url_encoded_query_string = 'max_amount=5.3&price=255.5&type=buy'

Schritt 3: md5-Hash über den in Schritt 2 erstellten Query-String der POST-Parameter bilden

post_parameter_md5_hashed_url_encoded_query_string = md5(url_encoded_query_string) // Es wird der MD5-Hash in hexadezimaler Form benötigt
=> '5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 4: Konkatinieren der HMAC-Eingabedaten

hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+post_parameter_md5_hashed_url_encoded_query_string
=> 'POST#https://api.bitcoin.de/v1/orders#MY_API_KEY#1234567#5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 5: Bilden des eigentlichen sha256-HMACs

hmac = HMAC('sha256', hmac_data, api_secret)
=> 'fd7c4c3af90524af1723bf89773904f87afdeaab2b87161799ee65f864aa9e96'

Die Übergabe erfolgt per HTTP5.1 Request. Wie gesagt der MD5 Hash sowie die SHA256 verschlüsslung liefern exakt das richtige Ergebnis. Entweder muss der url_encoded_query_string irgendwie noch in die ansteuernde URL eingebunden werden oder sonst was. Im Beispiel für GET Parameter muss es nämlich so gemacht werden. Aber auch dieser Versuch ergab keinen Erfolg.

Als Header werden bei POST die entsprechenden Parameter dem Header übergeben. Bei GET Funktioniert alles. Was fehlt mir noch?

RequestHeader "X-API-KEY"
RequestHeader "X-API-NONCE"
RequestHeader "X-API-SIGNATURE"

Link to comment
Share on other sites

Wie angesprochen, müssen die Postparameter als httpBody übergeben werden.

Hilft das?

 

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        [request setHTTPMethod:httpMethod];

        [request addValue:api_key           forHTTPHeaderField:@"X-API-KEY"];

        [request addValue:nonce             forHTTPHeaderField:@"X-API-NONCE"];

        [request addValue:hmac              forHTTPHeaderField:@"X-API-SIGNATURE"];

        if (postParametersString.lenght > 0

            && [httpMethod isEqualToString:HTTPMethodPOSTKey]) {

            [request setHTTPBody:[postParametersString dataUsingEncoding:NSUTF8StringEncoding]];

        }

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.