2014-06-26 11 views
5

Ich versuche, eine HMAC-SHA512-signierte Anfrage für einen API-Aufruf in Python 3.4 mit der Anfragen-Bibliothek zu erstellen. Ich versuche, Docs zu folgen, aber trete diesen Fehler ein:HMAC-Signaturanfragen in Python

AttributeError: '_hashlib.HASH' object has no attribute 'new' 

Hier ist ein Code. Es schlägt mit dem Fehler auf dem hmac-Konstruktor fehl. Es ist in Ordnung, wenn ich hashlib.md5() versuche oder übergebe oder den Parameter digest ganz weglasse.

Ich bin mir nicht sicher, ob ich die Anfrage später richtig signieren werde, da ich noch nicht so weit gekommen bin. Die Dokumente für den Dienst, den ich verwenden möchte, sagen, dass ich die URL mit meinem Geheimnis signieren soll. Ich brauche dies eine Byte-Zeichenfolge, damit dies funktioniert.

import hmac 
import hashlib 
import requests 

secret = b'mysecret' 
url = b'http://someurl.com/something/' 

signing = hmac.new(secret, url, hashlib.sha512()) 

headers = {'apisign': signing.digest()} 
response = requests.get(url, headers=headers) 

Alle Zeiger geschätzt. Ich konnte kein Beispiel finden. Vielen Dank!

Antwort

11

Sie in einem Verweis übergeben muss dem hashlib.sha512 aufrufbar, nicht das Ergebnis es der Aufruf:

signing = hmac.new(secret, url, hashlib.sha512) 

Alternativ können Sie verwenden nur die Zeichenfolge 'sha512':

signing = hmac.new(secret, url, 'sha512') 

und hashlib.new() wird verwendet, um das Hash-Objekt zu konstruieren.

Demo:

>>> import hashlib 
>>> import hmac 
>>> secret = b'mysecret' 
>>> url = b'http://someurl.com/something/' 
>>> signing = hmac.new(secret, url, hashlib.sha512) 
>>> signing.digest() 
b'!~s2\x97\x97\xa9\xcc\xefcb\xa8\xcc\xa7\xbc\xec\xe5\xfc\xc3\xac\xfc\xbc5]\x05\x96\xc7\x83\x8b\x1b\x90\xd3\xa5\xca\x8cLsC\x17\xa0\xea\xa3\xfe\xd8M\xfda\x1epj\x90\xff}\xfa\[email protected]\x92\xfb\xee\xa8\xab\x1b\x08\x8e' 
+0

Hah, das verpasst. Vielen Dank! – Ludo