Python HMAC: TypeError: mappage de caractères doit retourner un entier, Aucun ou unicode
J'ai un léger problème avec HMAC. Lors de l'exécution de ce morceau de code:
signature = hmac.new(
key=secret_key,
msg=string_to_sign,
digestmod=sha1,
)
J'obtiens une erreur étrange:
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py", line 133, in new
return HMAC(key, msg, digestmod)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py", line 72, in __init__
self.outer.update(key.translate(trans_5C))
TypeError: character mapping must return integer, None or unicode
Quand j'ai l'impression string_to_sign, c'est une bonne chaîne comme ceci:
GET
\n
\n
application/json
\n
\n
\n
Que signifie l'erreur moyenne? Est-ce parce que de nouvelles lignes?
Prendre un coup d'oeil ici.
Merci. Pourriez-vous poster comme réponse? J'ai utilisé de django.utils.l'encodage.smart_bytes pour convertir d'unicode à l'octet string, puis elle travaille.
Merci. Pourriez-vous poster comme réponse? J'ai utilisé de django.utils.l'encodage.smart_bytes pour convertir d'unicode à l'octet string, puis elle travaille.
OriginalL'auteur Richard Knop | 2013-12-31
Vous devez vous connecter pour publier un commentaire.
Comme demandé, je vais poster cela comme une réponse.
L'erreur que vous avez rencontré est un fonction de Python HMAC. Il n'accepte pas l'unicode.
Cette fonction est décrit ici.
HMAC est une fonction qui fonctionne au niveau octet. Pour cette raison, en Python 3, il n'accepte que les
bytes
. En Python 2 nous n'avons pasbytes
de sorte qu'il n'accepte que lesstr
.OriginalL'auteur smeso
S'assurer que les "clés" et "msg" est une chaîne de caractères.tels que:
merci une tonne! Cela a permis d'obtenir de diffusion dans openedx pile va...
OriginalL'auteur zhuxiongxian
Car je ne voulais pas écrire dans notre API docs que vous devez convertir la charge utile de l'ASCII ou de déposer des caractères Unicode, avant de comparer les digère, j'ai utilisé la solution suivante:
bytearray
tourne ma chaîne unicode en octets à l'aide de lautf-8
encodage.key
etmsg
sont octets de paramètres (commehmac
bibliothèque attend).OriginalL'auteur Danilo Cabello
En python 2
Si vous le code comme:
vous obtenez une erreur comme celle que vous avez fournie.
Toutefois, si vous utilisez
bytearray(key, 'utf-8')
en place de la clé brute variable etbytearray(_2_signature, 'utf-8')
en place de la _2_signature variable, il devrait fonctionner correctement.Par exemple:
OriginalL'auteur lotus echo