it-swarm.com.de

So korrigieren Sie TypeError: Unicode-Objekte müssen vor dem Hashing codiert 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 in Python 3.2.2 auszuführen:

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

Es wird wahrscheinlich nach einer Zeichencodierung aus wordlistfile gesucht.

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

Oder, wenn Sie Zeile für Zeile arbeiten:

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

Sie müssen encoding format wie utf-8, .__ definieren. Probieren Sie diesen einfachen Weg aus,

In diesem Beispiel wird eine Zufallszahl mit dem SHA256-Algorithmus generiert:

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

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()
15

Der Fehler sagt bereits, was Sie tun müssen. MD5 arbeitet mit Bytes, daher müssen Sie den Unicode-String in bytes codieren, z. mit line.encode('utf-8').

13
Cat Plus Plus

Bitte werfen Sie einen Blick auf das Antwort.

Die Fehlermeldung ist jetzt eindeutig: Sie können nur Bytes verwenden, keine Python-Zeichenfolgen (was früher unicode in Python <3 war). Sie müssen die Zeichenfolgen daher mit Ihrer bevorzugten Kodierung kodieren: utf-32, utf-16, utf-8 oder sogar einer von die eingeschränkten 8-Bit-Kodierungen (was manche Codepages nennen könnten).

Die Bytes in Ihrer Wortlistendatei werden automatisch von Python 3 in Unicode dekodiert, wenn Sie aus der Datei lesen. Ich schlage vor, Sie machen:

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

so dass die zum md5-Algorithmus übertragenen verschlüsselten Daten genau wie die zugrunde liegende Datei verschlüsselt werden.

9
tzot

Sie können die Datei im Binärmodus öffnen:

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

das Kodieren dieser Zeile fixierte es für mich.

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