web-dev-qa-db-fra.com

Comment corriger TypeError: les objets Unicode doivent être codés avant le hachage?

J'ai cette erreur:

Traceback (most recent call last):
  File "python_md5_cracker.py", line 27, in <module>
  m.update(line)
TypeError: Unicode-objects must be encoded before hashing

quand j'essaye d'exécuter ce code dans Python 3.2.2 :

import hashlib, sys
m = hashlib.md5()
hash = ""
hash_file = input("What is the file name in which the hash resides?  ")
wordlist = input("What is your wordlist?  (Enter the file name)  ")
try:
        hashdocument = open(hash_file,"r")
except IOError:
        print("Invalid file.")
        raw_input()
        sys.exit()
else:
        hash = hashdocument.readline()
        hash = hash.replace("\n","")

try:
        wordlistfile = open(wordlist,"r")
except IOError:
        print("Invalid file.")
        raw_input()
        sys.exit()
else:
        pass
for line in wordlistfile:
        m = hashlib.md5()  #flush the buffer (this caused a massive problem when placed at the beginning of the script, because the buffer kept getting overwritten, thus comparing incorrect hashes)
        line = line.replace("\n","")
        m.update(line)
        Word_hash = m.hexdigest()
        if Word_hash==hash:
                print("Collision!  The Word corresponding to the given hash is", line)
                input()
                sys.exit()

print("The hash given does not correspond to any supplied Word in the wordlist.")
input()
sys.exit()
190
JohnnyFromBF

Il recherche probablement un caractère encodant à partir de wordlistfile.

wordlistfile = open(wordlist,"r",encoding='utf-8')

Ou, si vous travaillez ligne par ligne:

line.encode('utf-8')
193
cwallenpoole

Vous devez avoir à définir encoding format comme utf-8, Essayez ce moyen facile

Cet exemple génère un nombre aléatoire à l'aide de l'algorithme SHA256:

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
87
Jay Patel

Pour stocker le mot de passe (PY3):

import hashlib, os
password_salt = os.urandom(32).hex()
password = '12345'

hash = hashlib.sha512()
hash.update(('%s%s' % (password_salt, password)).encode('utf-8'))
password_hash = hash.hexdigest()
15
Khắc Nghĩa Từ

L'erreur dit déjà ce que vous devez faire. MD5 fonctionne sur des octets, vous devez donc coder une chaîne Unicode en bytes, par exemple avec line.encode('utf-8').

13
Cat Plus Plus

S'il vous plaît jetez un coup d'oeil d'abord à que réponse.

Maintenant, le message d'erreur est clair: vous ne pouvez utiliser que des octets, pas des chaînes Python (ce qui était unicode dans Python <3), vous devez donc coder les chaînes avec votre codage préféré: utf-32, utf-16, utf-8 ou même l’un des codages à 8 bits restreints (que certains pourraient appeler des pages de codes).

Les octets de votre fichier de liste de mots sont automatiquement décodés en Unicode par Python 3 au fur et à mesure de la lecture du fichier. Je vous suggère de faire:

m.update(line.encode(wordlistfile.encoding))

de sorte que les données encodées poussées vers l'algorithme md5 soient encodées exactement comme le fichier sous-jacent.

9
tzot

Vous pouvez ouvrir le fichier en mode binaire:

import hashlib

with open(hash_file) as file:
    control_hash = file.readline().rstrip("\n")

wordlistfile = open(wordlist, "rb")
# ...
for line in wordlistfile:
    if hashlib.md5(line.rstrip(b'\n\r')).hexdigest() == control_hash:
       # collision
5
jfs
import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())
1
Sabyasachi

encoder cette ligne l'a corrigé pour moi.

m.update(line.encode('utf-8'))
0
Mike Cash