463 Stimmen

Wie man TypeError korrigiert: Unicode-Objekte müssen vor dem Hashing kodiert werden?

Ich habe diesen Fehler:

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

wenn ich versuche, diesen Code auszuführen 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()

441voto

cwallenpoole Punkte 75701

Er sucht wahrscheinlich nach einer Zeichenkodierung aus wordlistfile .

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

Oder, wenn Sie Zeile für Zeile arbeiten:

line.encode('utf-8')

EDIT

Gemäß dem unten stehenden Kommentar und diese Antwort .

Meine obige Antwort geht davon aus, dass die gewünschte Ausgabe ein str von der wordlist Datei. Wenn Sie mit der Arbeit in bytes dann ist es besser, Sie verwenden open(wordlist, "rb") . Aber es ist wichtig, daran zu denken, dass Ihr hashfile sollte NICHT verwenden. rb wenn Sie es mit der Ausgabe von hexdigest . hashlib.md5(value).hashdigest() gibt eine str und die nicht direkt mit einem Byte-Objekt verglichen werden können: 'abc' != b'abc' . (Es gibt noch viel mehr zu diesem Thema, aber ich habe nicht die Zeit dazu).

Es ist auch zu beachten, dass diese Linie:

line.replace("\n", "")

Sollte wahrscheinlich sein

line.strip()

Das funktioniert sowohl für Bytes als auch für Strs. Aber wenn Sie sich entscheiden, einfach zu konvertieren bytes dann können Sie die Zeile ändern in:

line.replace(b"\n", b"")

183voto

Jaykumar Patel Punkte 25455

Sie müssen definieren encoding format wie utf-8 , Versuchen Sie diese einfache Methode,

In diesem Beispiel wird eine Zufallszahl mit dem Algorithmus SHA256 erzeugt:

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

44voto

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

23voto

Cat Plus Plus Punkte 119072

Der Fehler sagt bereits, was Sie zu tun haben. MD5 arbeitet mit Bytes, also müssen Sie eine Unicode-Zeichenfolge kodieren in bytes z.B. mit line.encode('utf-8') .

19voto

Zum Speichern des Passworts (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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X