2014-06-26 12 views
5

Sto provando a creare una richiesta firmata HMAC-SHA512 per una chiamata API in Python 3.4 utilizzando la libreria delle richieste. Sto cercando di seguire i documenti, ma sto colpendo questo errore:Richieste di firma HMAC in Python

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

Ecco un po 'di codice. Sta fallendo l'errore sul costruttore hmac. Va bene se provo a passare hashlib.md5() o ometto completamente il parametro digest.

Non sono sicuro di firmare correttamente la richiesta in seguito, poiché non sono ancora arrivato così lontano. I documenti per il servizio che sto cercando di usare dicono di firmare l'URL con il mio segreto. Ho bisogno che questa stringa di byte funzioni correttamente.

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) 

Qualsiasi suggerimento apprezzato. Non ho trovato un esempio. Grazie!

risposta

11

È necessario passare un riferimento al hashlib.sha512 callable, non il risultato di chiamarla:

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

In alternativa, si potrebbe utilizzare la stringa 'sha512':

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

e hashlib.new() sarà usato per costruire l'oggetto hash.

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, perso. Grazie! – Ludo