So korrigieren Sie TypeError: Unicode-Objekte müssen vor dem Hashing codiert werden?

295

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:
  # 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()
JohnnyFromBF
quelle
Ich fand, dass das Öffnen einer Datei mit 'rb' meinem Fall geholfen hat.
Dlamblin

Antworten:

299

Es wird wahrscheinlich nach einer Zeichenkodierung von gesucht wordlistfile.

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

Oder wenn Sie zeilenweise arbeiten:

line.encode('utf-8')
cwallenpoole
quelle
3
open(wordlist,"r",encoding='utf-8')Warum Open mit spezifischer Codierung verwenden, wird die Codierung als Decodierungscodec angegeben. Ohne diese Option wird die plattformabhängige Codierung verwendet.
Tanky Woo
129

Sie müssen definieren encoding formatwie utf-8: Versuchen Sie diesen einfachen Weg,

In diesem Beispiel wird mithilfe des SHA256-Algorithmus eine Zufallszahl generiert:

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

So speichern Sie das Passwort (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()
Khắc Nghĩa Từ
quelle
1
Diese Zeile macht die Verwendung des Passworts unmöglich. password_salt = os.urandom (32) .hex () Es sollte ein fester bekannter Wert sein, der jedoch nur für Server geheim sein kann. Bitte korrigieren Sie mich oder passen Sie es an Ihren Code an.
Yash
1
Ich stimme @Yash zu. Sie haben entweder ein einzelnes Salz, das Sie für jeden Hash verwenden (nicht das beste), oder wenn Sie für jeden Hash ein zufälliges Salz generieren, müssen Sie es zusammen mit dem Hash speichern, um es später zum Vergleich erneut zu verwenden
Carson Evans
15

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

Cat Plus Plus
quelle
11

Bitte schauen Sie sich zuerst diese Antwort an.

Nun ist die Fehlermeldung klar: Sie können nur Bytes verwenden, nicht Python - Strings (was früher seine unicodein Python <3), so dass Sie die Saiten mit Ihrer bevorzugten Codierung zu codieren haben: utf-32, utf-16, utf-8oder auch nur eine der eingeschränkten 8- Bitcodierungen (was manche als Codepages bezeichnen).

Die Bytes in Ihrer Wortlistendatei werden von Python 3 beim Lesen aus der Datei automatisch in Unicode dekodiert. Ich schlage vor, Sie tun:

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

Damit werden die codierten Daten, die an den MD5-Algorithmus gesendet werden, genau wie die zugrunde liegende Datei codiert.

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

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
jfs
quelle
6

Das Codieren dieser Zeile hat es für mich behoben.

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

Wenn es sich um eine einzeilige Zeichenfolge handelt. wickeln Sie es mit b oder B. zB:

variable = b"This is a variable"

oder

variable2 = B"This is also a variable"
SBimochan
quelle
-3

Dieses Programm ist die fehlerfreie und erweiterte Version des oben genannten MD5-Crackers, die die Datei mit der Liste der Hash-Passwörter liest und sie mit Hash-Wörtern aus der englischen Wörterbuch-Wortliste vergleicht. Hoffe es ist hilfreich.

Ich habe das englische Wörterbuch über den folgenden Link heruntergeladen: 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()
udz
quelle