2011-09-28 10 views
130

que tienen este error:Cómo corregir TypeError: ¿Los objetos Unicode deben codificarse antes del hash?

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 trato de 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() 
+0

Descubrí que abrir un archivo con 'rb' ayudó a mi caso. – dlamblin

Respuesta

132

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

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

O, si usted está trabajando en una base de línea por línea:

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

'abrir (lista de palabras," r ", codificación = 'utf-8')' por qué utilizar abrir con codificación específica, la codificación se especifica el códec de decodificación, sin esta opción, utiliza codificación dependiente de la plataforma. –

10

El error ya se dice lo que tiene que hacer. MD5 funciona en bytes, por lo que debe codificar una cadena Unicode en bytes, p. con line.encode('utf-8').

+52

Downvoted, porque la oración "El error ya dice lo que tiene que hacer". es muy rudo y no agrega nada. – timthelion

+12

@timthelion Añade la implicación de que la comprensión de lectura es un requisito previo para la programación. Terrible, lo sé. –

+11

@timthelion Realmente. No tienes nada mejor que hacer que emitir un juicio moral sobre la redacción de una respuesta de ~ 4 años. Y no es grosero (es real) y es útil (puede leer el mensaje de una manera que le ayude a encontrar la solución). – sehe

8

favor, eche un vistazo por primera vez en that respuesta.

Ahora, el mensaje de error es clara: sólo se puede utilizar bytes, no cadenas de Python (lo que solían ser unicode en Python < 3), así que hay que 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 en Unicode por Python 3 a medida que lee del archivo. Le sugiero que haga:

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

de manera que los datos codificados empujados al algoritmo MD5 se codifican exactamente igual que el de archivos subyacente.

45

Debe tener para definir encoding format como utf-8, probar este camino más fácil,

En este ejemplo se genera un número aleatorio utilizando el algoritmo SHA256:

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

Se podría 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 
6

para almacenar la contraseña (AP3):

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() 
Cuestiones relacionadas