Zum Inhalt springen

Tyler_Durden

Mitglied
  • Gesamte Inhalte

    29
  • Benutzer seit

  • Letzter Besuch

Beiträge von Tyler_Durden

  1. vor 11 Stunden schrieb casiopaya:

    Hallo

    >> warum ich die ganzen Infos zu dem Link mit in den hmac-code einfließen lasse

    Du signierst damit deinen Call. Damit kann die Gegenstelle verifizieren, dass der von dir kommt (bzw. von jemandem, der deinen PRIVATEKEY hat, was nur du sein solltest).

    >> hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+ get_parameter_url_encoded_query_string

    Da fehlt doch im Falle von GET das "#d41d8cd98f00b204e9800998ecf8427e" als "md5 hash über die nicht vorhandenen POST parameter" (hier stellt sich tatsächlich die Frage nach der Sinnhaftigkeit...)

    >> was der Header bei dem API-Call ist

    Der HTTP Standard definiert das so. 1. Methode (GET, POST, PUT etc), 2. URL (die Zieladresse), 3. Header (Key-Value-Paare) und 4. Body (im Prinzip ein Bytearray, es gibt verschiedene Unterformate wie man einen Body mit welchem Inhalt verschicken kann.)

    >> Mit dem v4 stoße ich aber auf einen 400-Error

    Was kommt denn als Body zurück? Da ich nicht regelmäßig mit Python arbeite kann ich auf die schnelle nicht beurteilen, ob die h.* aufrufe korrekt sind.

    Grüße casiopaya

    Ich habe jetzt mal geschaut ob mein python-code bei der hmca-Methode das selbe Ergebnis ausgibt wie ein Onlinetool für SHA265 (für random Testdaten). Das ist der Fall.

    Im Aufbau meiner hmac_data Variable sehe ich aber keinen Fehler im Vergleich zur Doku.
    Vom Error 5 her verstehe ich es aber so, dass lediglich die Signatur das Problem ist?

  2. vor einer Stunde schrieb casiopaya:

    Hey,

    vielen Dank für die ausführliche und hilfreiche Antowort.

    >>Du signierst damit deinen Call. Damit kann die Gegenstelle verifizieren, dass der von dir kommt (bzw. von jemandem, der deinen PRIVATEKEY hat, was nur du sein solltest).

    Was ich explizit meinte war, dass ich noch einmal die uri samtt Parametern in dem hash codiere.
    Für mich sieht es doppelt aus. Ich kann es mir also nur so erklären, dass jedee X-API-SIGNATURE auf die Art der Anfrage codiert ist. Ich also mit einem abgefangenen X-API-SIGNATURE für meineOrderbookabfrage nicht auch einen Kauf einstellen kann (wobei ich dachte das würde durch den immer ansteigenen nonce schön unmöglich werden).
    Aber da fehlt mir glaube ich zu viel Wissen zu Kryptografie und IT-Sicherheit.

     

    >>Da fehlt doch im Falle von GET das "#d41d8cd98f00b204e9800998ecf8427e" als "md5 hash über die nicht vorhandenen POST parameter" (hier stellt sich tatsächlich die Frage nach der Sinnhaftigkeit...)

    Da hast du vollkommen recht. Durch mein frustriertes rumgeschiebe und ausprobieren habe ich die Anfrage total zerschossen.
    So sah er vorher aus:

    
    import hashlib
    import hmac
    import requests
    import time
    import json
    
    
    api_key     =   "KEY"                 	# Entspricht dem eigenen API-Key
    nonce       =   str(int(time.time()))   # Das für den aktuellen Request verwendete Nonce
    api_secret  =   "SECRET"         		# Entspricht dem eigenen API-Secret
    http_method =   'GET'
    uri         =   'https://api.bitcoin.de/v4/orders'
    
    get_parameter_url_encoded_query_string = "type=buy"
    
    uri = uri+'?'+ get_parameter_url_encoded_query_string
    
    post_parameter_url_encoded_query_string = "d41d8cd98f00b204e9800998ecf8427e"
    
    hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+ post_parameter_url_encoded_query_string
    
    h = hmac.new(bytes(api_secret, 'utf-8'), b'', hashlib.sha256)
    h.update(bytes(hmac_data, 'utf-8'))
    print (h.hexdigest())
    
    get_parameter = {'type': 'buy'}
    
    head ={'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
    
    r = requests.get('https://api.bitcoin.de/v4/btceur/orderbook', params=get_parameter, headers=head)
    
    print (r.status_code)

    Was kommt denn als Body zurück? Da ich nicht regelmäßig mit Python arbeite kann ich auf die schnelle nicht beurteilen, ob die h.* aufrufe korrekt sind.

    Die Farge nach dem Body habe ich mir nie gestellt, ich dachte ich bekomem nur die 400 als Statuscode zurück.
    Das war also ein super Ansatz:

    
    {"errors":[{"message":"Invalid signature","code":5}],"credits":43}

    Ich kann es also auf die X-API-SIGNATURE eingrenzen, das war ja bereits mein Verdacht. Aber schön, dass es stimmte :D
    Ich werde morgen einmal schauen, ob ein PHP skript mit dem

    
    HMAC('sha256', hmac_data, api_secret)

    bei einem Test das gleiche auswirft wie python mit dem hashlib.sha256.

     

     

  3. vor 31 Minuten schrieb Männergruppe Monk:

    Dazu folgende Tips

    1. Wenn Du das API Spiel spielen willst, lern programmieren. 

    2. Wenn Du ne API haben willst, es gibt sehr viele auf Rest Server bei Github. Und das in fast allen Sprachen. Die sind in der Regel ausgetestet und Dokumentiert, da muss man nicht viel machen.

    3. Fang bei 1 wieder an.

    0 .Ich frage mich bei Foren manchmal warum Antworten so sinnfrei und inhalts- und hilfefrei sein müssen.
    Bestimmt hast du es voll drauf und die Fragen sind für dich vielleicht total doof. Das will ich dir gar nicht absprechen. Aber auch du bist nicht als Programmier und Bitcoin Pro vom Baum gefallen.
    Deine von mir subjektiv empfundene Abfällige Art ist demotivierend, unnötig und unangebracht.

    1. Wie gesagt: Es soll ein Lern-Projekt sein, um mich mit Programmieren zu beschäftigen (und es damit besser zu lernen). Ob es das sinnvollste Projekt dafür ist sei man so dahingestellt, aber es ist nun mal das, was ich mir ausgesucht habe. Wenn ich scheitere war ich selbst schuld.

    2. Bei github gibt es eine API-python skript extra für bitcoin.de, die aber auf Version 2 oder so basiert und inaktiv ausssieht. Ausserdem geht es ir nicht darum etwas fertiges zu haben, sondern etwas zu erschaffen. Aus Gründen s. 1.

    3. klar, Sarkasmus ist super lustig, aber lies mal 0. und schau dir mal die Antwort von casiopaya an, wie eine hilfrecihe Antwort aussehen kann.
    Bei deinem Post hättest du vor dem Abschicken lieber mal das Tab geschlossen. Dein Post war nämlich nicht nur keine Hilfe sondern war destruktiv.

    • Like 2
  4. Hallo liebe Coinler,

    ich habe mich die letzten Tage mit der API beschäftigt.
    Um mal ein Projekt zu haben, bei dem ich ein wenig meine (begrenzten) Programmierkenntnisse zu nutzen fand ich das sehr spannend. - Erstmal geht es mir also nur um ein Get des Orderbooks und rumspielen mit dem Datensatz.

    Mit dem Basic-Satz ist schon mal alles gut soweit. Ich bekomme den Ask und Bid Satz als dict of lists und kann die Daten darin verarbeiten.

    Mit dem v4 stoße ich aber auf einen 400-Error. Mir werden aber credits beim ausführen abgezogen und die Trading-API Notaus-Link Mail kommt auch.
    Also bin ich nicht voll auf dem Holzweg, oder? :(

    Das hier soll keine Disskussion darüb sein, ob Python das richtige Tool ist o.ä. (es sei denn, dass es Systemseitig einfach damit nicht geht) da es wie gesagt ein Projekt ist um mit der Programmiersprache zu arbeiten, also der Weg das Ziel ist.

    Anbei einmal mein Code zum Zweck der Hilfestellung :)

    import hashlib
    import hmac
    import requests
    import time
    import json
    
    
    api_key     =   "MEIN API KEY"            # Entspricht dem eigenen API-Key
    nonce       =   str(int(time.time()))     # Das für den aktuellen Request verwendete Nonce
    api_secret  =   "MEIN API SECRET"         # Entspricht dem eigenen API-Secret
    http_method =   'GET'
    uri         =   'https://api.bitcoin.de/v4/orders'
    
    get_parameter_url_encoded_query_string = "type=buy"
    
    uri = uri+'?'+ get_parameter_url_encoded_query_string
    
    hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+ get_parameter_url_encoded_query_string
    
    h = hmac.new(bytes(api_secret, 'utf-8'), b'', hashlib.sha256)
    h.update(bytes(hmac_data, 'utf-8'))
    
    get_parameter = {'type': 'buy'}
    
    head ={'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
    
    r = requests.get('https://api.bitcoin.de/v4/btceur/orderbook', params=get_parameter, headers=head)

    Ich bin kein Programmierer, oder überhaupt IT-ler, daher musste ich bereits viel über API und HTTP-Requests lernen, das bedeutet aber auch, dass mein Fehler vielleicht total offensichtlich und dämlich ist, weil ich z.B. immer noch nicht 100% verstehe was der Header bei dem API-Call ist und lediglich versuche es anzuwenden.

    Es ist mir z.B. auch ein Rätsel, warum ich die ganzen Infos zu dem Link mit in den hmac-code einfließen lasse, verstehe es aber momentan als zusätzlcihe Sicherheitseinrichtung.

×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.