web-dev-qa-db-fra.com

hashlib.md5 () TypeError: les objets Unicode doivent être encodés avant le hachage

Je suis nouveau dans le codage et j'ai rencontré un problème en essayant de coder une chaîne.

>>> import hashlib
>>> a = hashlib.md5()
>>> a.update('hi')
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    a.update('hi')
TypeError: Unicode-objects must be encoded before hashing
>>> a.digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'

Est-ce que (a) est maintenant considéré comme codé?

Deuxième question: lorsque j'exécute le même code ci-dessus dans un script, j'obtiens cette erreur:

import hashlib
a = hashlib.md5()
a.update('hi')
a.digest()

Traceback (dernier appel le plus récent): Fichier "C:/Users/User/Desktop/Logger/Encoding practice.py", ligne 3, dans a.update ('hi') TypeError: Les objets Unicode doivent être encodés avant le hachage

Pourquoi le code fonctionne-t-il dans le shell et non dans le script? Je travaille avec Windows et Python 3.4

Merci.

19
Shahab

Puisque vous encodez des chaînes simples, je déduis que vous exécutez Python 3 où toutes les chaînes sont des objets Unicode, vous avez deux options:

  1. Fournissez un encodage pour les chaînes, par exemple: "Nobody inspects".encode('utf-8')
  2. Utilisez des chaînes binaires comme indiqué dans les manuels:

    m.update(b"Nobody inspects")
    m.update(b" the spammish repetition")
    

La raison du comportement différent dans le script du shell est que le script s'arrête sur l'erreur alors que dans le shell, la dernière ligne est une commande distincte mais ne fait toujours pas ce que vous souhaitez en raison de l'erreur précédente.

18
Steve Barnes

La solution que j'ai trouvée consiste à simplement encoder les données immédiatement dans la ligne où vous les hachez:

hashlib.sha256("a".encode('utf-8')).hexdigest()

Cela a fonctionné pour moi, j'espère que cela aide!

18
Matej Butković

Sous les différentes versions de Python est différent, j'utilise Python 2.7, comme vous écrivez, cela fonctionne bien).

hashlib.md5 (data), le type des paramètres de données doit être 'octets', c'est-à-dire qu'il faut mettre le type de données en octets avant les hachages.

Exigences avant la conversion du code de hachage, car la même chaîne a des valeurs différentes sous différents systèmes de codage (utf8\gbk .....), afin d'éviter que l'ambiguïté ne soit une conversion dominante.

2
NeoWu

Pour Python3, ce qui suit a fonctionné.

secretKey = b"secret key that you get from Coginito -> User Pool -> General Settings -> App Clients-->Click on Show more details -> App client secret"
        clientId = "Coginito -> User Pool -> General Settings -> App Clients-->App client id"
        digest = hmac.new(secretKey,
                  msg=(user_name + clientId).encode('utf-8'),
                  digestmod=hashlib.sha256
                 ).digest()
        signature = base64.b64encode(digest).decode()

Le nom d'utilisateur nom_utilisateur ci-dessus est le même que l'utilisateur que vous souhaitez enregistrer dans le cognito.

1
Haris Np

Cela ne fonctionne pas dans le REPL. Il n'y a rien de haché, puisque vous ne l'avez passé rien de valable pour le hachage. Essayez d'abord de coder.

3>> hashlib.md5().digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'
3>> a = hashlib.md5()
3>> a.update('hi'.encode('utf-8'))
3>> a.digest()
b'I\xf6\x8a\\\x84\x93\xec,\x0b\xf4\x89\x82\x1c!\xfc;'
1