org descargar python python-3.x unicode syntax-error hashlib

python - descargar - Cómo corregir TypeError: los objetos Unicode deben codificarse antes de hash?



python 368 (6)

Tengo este error:

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

cuando intento ejecutar este código en 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()


Debe tener que definir el encoding format como utf-8 , pruebe de esta manera fácil,

Este ejemplo genera un número aleatorio usando el algoritmo SHA256:

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


El error ya dice lo que tienes que hacer. MD5 funciona en bytes, por lo que debe codificar la cadena Unicode en bytes , por ejemplo, con line.encode(''utf-8'') .


Para almacenar la contraseña (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()


Por favor, eche un vistazo primero a that respuesta.

Ahora, el mensaje de error es claro: solo puede usar bytes, no cadenas Python (lo que solía ser unicode en Python <3), por lo que debe codificar las cadenas con su codificación preferida: utf-32 , utf-16 , utf-8 o incluso una de las codificaciones restringidas de 8 bits (lo que algunos podrían llamar páginas de códigos).

Los bytes en su archivo de lista de palabras se están decodificando automáticamente a Unicode por Python 3 a medida que lee del archivo. Te sugiero que hagas:

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

de modo que los datos codificados que se envían al algoritmo md5 se codifican exactamente como el archivo subyacente.


Probablemente esté buscando una codificación de caracteres de wordlistfile .

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

O bien, si está trabajando línea por línea:

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


Puede abrir el archivo en modo binario:

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