web-dev-qa-db-fra.com

Comment utiliser le hachage sha256 dans Python

J'essaie de lire un fichier de mots de passe. Ensuite, j'essaie de calculer le hachage pour chaque mot de passe et de le comparer à un hachage que je dois déjà déterminer si j'ai découvert le mot de passe. Cependant, le message d'erreur que je reçois est "TypeError: les objets Unicode doivent être encodés avant le hachage". Voici mon code:

from hashlib import sha256

with open('words','r') as f:
    for line in f:

        hashedWord = sha256(line.rstrip()).hexdigest()

        if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
            print(line + "is one of the words!")

Quelqu'un peut-il s'il vous plaît aider et fournir une explication?

18
user3479683

Le message d'erreur signifie exactement ce qu'il dit: vous avez une chaîne Unicode. Vous ne pouvez pas SHA-256-hacher une chaîne Unicode, vous ne pouvez hacher que des octets.

Mais pourquoi avez-vous une chaîne Unicode? Parce que vous ouvrez un fichier en mode texte, ce qui signifie que vous demandez implicitement Python de décoder les octets de ce fichier (en utilisant votre encodage par défaut) en Unicode. Si vous voulez obtenir le octets bruts, vous devez utiliser le mode binaire.

En d'autres termes, changez simplement cette ligne:

with open('words','r') as f:

… à:

with open('words', 'rb') as f:

Vous pouvez remarquer qu'une fois que vous avez résolu ce problème, la ligne print lève une exception. Pourquoi? car vous essayez d'ajouter un bytes à un str. Vous manquez également un espace et vous imprimez la ligne non dépouillée. Vous pouvez résoudre tous ces problèmes en utilisant deux arguments pour print (comme dans print(line.rstrip(), "is one of the words")).

Mais vous obtiendrez alors une sortie comme b'\xc3\x85rhus' is one of the words Lorsque vous voudrez qu'il imprime Århus is one of the words. C'est parce que vous avez maintenant des octets, pas des chaînes. Puisque Python ne décode plus pour vous, vous devrez le faire manuellement. Pour utiliser le même codage par défaut qui fonctionne parfois lorsque vous ne spécifiez pas de codage pour open, appelez simplement decode sans argument. Donc:

print(line.rstrip().decode(), "is one of the words")
17
abarnert