Come correggere TypeError: gli oggetti Unicode devono essere codificati prima dell'hashing?


295

Ho questo errore:

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

quando provo ad eseguire questo codice in 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:
  # 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)
  m = hashlib.md5()
  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()

Ho scoperto che l'apertura di un file con 'rb' ha aiutato il mio caso.
dlamblin,

Risposte:


299

Probabilmente sta cercando un personaggio che codifica wordlistfile.

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

Oppure, se stai lavorando riga per riga:

line.encode('utf-8')

3
open(wordlist,"r",encoding='utf-8')perché utilizzare open con codifica specifica, la codifica viene specificata come codec di decodifica, senza questa opzione, utilizza la codifica dipendente dalla piattaforma.
Tanky Woo,

129

Devi definire encoding formatcome utf-8, provare in questo modo semplice,

Questo esempio genera un numero casuale usando l'algoritmo SHA256:

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

18

Per memorizzare la password (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()

1
Questa riga rende impossibile l'uso della password. password_salt = os.urandom (32) .hex () Dovrebbe avere un valore noto fisso ma può essere segreto solo per il server. Per favore, correggimi o adattalo al tuo codice.
Yash,

1
Sono d'accordo con @Yash O hai un solo sale che usi per ogni hash (non il migliore), o se generi un sale casuale per ogni hash, devi memorizzarlo con l'hash per riutilizzarlo più tardi per il confronto
Carson Evans

15

L'errore dice già cosa devi fare. MD5 funziona su byte, quindi è necessario codificare la stringa Unicode bytes, ad es line.encode('utf-8'). Con .


11

Per favore dai un'occhiata prima a quella risposta.

Ora, il messaggio di errore è chiaro: è possibile utilizzare solo byte, non stringhe Python (quello che era unicodein Python <3), in modo da avere per codificare le corde con la codifica preferita: utf-32, utf-16, utf-8o anche uno dei più ristretta 8- codifiche di bit (ciò che alcuni potrebbero chiamare codepage).

I byte nel file della tua lista di parole vengono automaticamente decodificati in Unicode da Python 3 mentre leggi il file. Ti suggerisco di fare:

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

in modo che i dati codificati inviati all'algoritmo md5 siano codificati esattamente come il file sottostante.


10
import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())

6

È possibile aprire il file in modalità binaria:

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

la codifica di questa riga l'ha risolto per me.

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

0

Se è una stringa a riga singola. avvolgerlo con b o B. ad esempio:

variable = b"This is a variable"

o

variable2 = B"This is also a variable"

-3

Questo programma è la versione senza errori e migliorata del suddetto cracker MD5 che legge il file contenente l'elenco di password con hash e lo confronta con la parola con hash dall'elenco delle parole del dizionario inglese. Spero sia utile

Ho scaricato il dizionario inglese dal seguente link https://github.com/dwyl/english-words

# md5cracker.py
# English Dictionary https://github.com/dwyl/english-words 

import hashlib, sys

hash_file = 'exercise\hashed.txt'
wordlist = 'data_sets\english_dictionary\words.txt'

try:
    hashdocument = open(hash_file,'r')
except IOError:
    print('Invalid file.')
    sys.exit()
else:
    count = 0
    for hash in hashdocument:
        hash = hash.rstrip('\n')
        print(hash)
        i = 0
        with open(wordlist,'r') as wordlistfile:
            for word in wordlistfile:
                m = hashlib.md5()
                word = word.rstrip('\n')            
                m.update(word.encode('utf-8'))
                word_hash = m.hexdigest()
                if word_hash==hash:
                    print('The word, hash combination is ' + word + ',' + hash)
                    count += 1
                    break
                i += 1
        print('Itiration is ' + str(i))
    if count == 0:
        print('The hash given does not correspond to any supplied word in the wordlist.')
    else:
        print('Total passwords identified is: ' + str(count))
sys.exit()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.