J'ai la ligne de code suivante:signe Python 3 un message avec SHA512 clés
return hmac.new(self.Secret.upper() , message , hashlib.sha512).digest().encode("base64").replace("\n","")
Cela fonctionne très bien dans python2, mais pas en Python 3. Dès que je tente en Python 3, je suis:
TypeError: key: expected bytes or bytearray, but got 'str'
de hmac.py
. J'ai bien sûr essayé de convertir self.Secret
et message
en utilisant bytes()
et bytearray()
, mais cela n'a pas fonctionné non plus.
J'ai également essayé d'utiliser hashlib.sha512
pour générer la clé, mais ce n'est pas très clair pour moi. J'ai une clé API secrète qui doit être utilisée pour signer les données POST et la seule façon claire de le faire est d'utiliser hmac.new()
, mais quand je reçois finalement quelque chose qui peut être passé sous forme de chaîne, il ne ressemble à rien, et comme prévu, je ne peux pas m'authentifier avec.
Une autre tentative a été:
sign = hashlib.sha512(message_to_sign)
sign.update(self.Secret.upper())
Cela produit aussi une chaîne qui ne ressemble en rien la clé de travail qui vient du code d'origine en Python 2.7.
J'ai aussi essayé beaucoup d'autres variations, mais aucune d'entre elles ne me donne quelque chose qui fonctionne.
En python3, hmac.new (**) accepte ** clé ** comme octets/bytearray, pas de chaîne (comme l'erreur suggérée, et différences entre py2 manipulant des chaînes/octets). Donc vous avez probablement besoin de le convertir comme 'bytes (self.Secret(). Upper()," utf-8 ")' ... – Anzel
Oui, j'ai essayé ça. C'est ce que je voulais dire quand j'ai dit que j'avais essayé de les convertir. J'ai utilisé bytearray() et bytes(), mais pas non plus pour moi. Cependant, j'ai maintenant une clé de recherche valide, je ne suis pas sûr que ce soit correct parce que je n'utilise pas ma clé pour signer les données de publication. Je reçois également une nouvelle erreur de l'API concernant un nom d'en-tête invalide, ce qui n'a aucun sens puisque j'inclue seulement ceux qu'ils me disent d'utiliser. Cela arrive si j'utilise python-requests ou pycurl. –