Bagaimana cara memperbaiki TypeError: Objek-Unicode harus dikodekan sebelum hashing?

295

Saya memiliki kesalahan ini:

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

ketika saya mencoba menjalankan kode ini dengan 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()
JohnnyFromBF
sumber
Saya menemukan membuka file dengan 'rb' membantu kasus saya.
dlamblin

Jawaban:

299

Mungkin sedang mencari pengkodean karakter dari wordlistfile.

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

Atau, jika Anda bekerja berdasarkan garis demi garis:

line.encode('utf-8')
cwallenpoole
sumber
3
open(wordlist,"r",encoding='utf-8')mengapa menggunakan terbuka dengan pengkodean spesifik, pengkodean ditentukan codec decode, tanpa opsi ini, itu menggunakan pengkodean tergantung platform.
Tanky Woo
129

Anda harus mendefinisikan encoding formatseperti utf-8, Coba dengan cara mudah ini,

Contoh ini menghasilkan angka acak menggunakan algoritma SHA256:

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

Untuk menyimpan kata sandi (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ừ
sumber
1
Baris ini membuat kata sandi tidak mungkin digunakan. password_salt = os.urandom (32) .hex () Seharusnya memiliki nilai yang diketahui tetapi dapat dirahasiakan hanya untuk server. Harap perbaiki saya atau sesuaikan dengan kode Anda.
Yash
1
Saya setuju dengan @Yash Anda juga memiliki satu garam yang Anda gunakan untuk setiap hash (bukan yang terbaik), atau jika Anda menghasilkan garam acak untuk setiap hash, Anda harus menyimpannya dengan hash untuk digunakan lagi nanti untuk perbandingan
Carson Evans
15

Kesalahan sudah mengatakan apa yang harus Anda lakukan. MD5 beroperasi pada byte, jadi Anda harus menyandikan string Unicode ke bytes, misalnya dengan line.encode('utf-8').

Cat Plus Plus
sumber
11

Silakan lihat pertama di yang jawabannya.

Sekarang, pesan kesalahan jelas: Anda hanya dapat menggunakan byte, bukan Python string (apa yang digunakan untuk menjadi unicodePython <3), sehingga Anda harus menyandikan string dengan encoding pilihan Anda: utf-32, utf-16, utf-8atau bahkan salah satu dibatasi 8- bit encodings (apa yang beberapa orang sebut codepages).

Bytes dalam file wordlist Anda secara otomatis diterjemahkan ke Unicode oleh Python 3 saat Anda membaca dari file. Saya sarankan Anda melakukannya:

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

sehingga data yang dikodekan didorong ke algoritma md5 dikodekan persis seperti file yang mendasarinya.

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

Anda bisa membuka file dalam mode biner:

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
sumber
6

penyandian baris ini memperbaikinya untuk saya.

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

Jika itu adalah string baris tunggal. bungkus dengan b atau B. misalnya:

variable = b"This is a variable"

atau

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

Program ini adalah versi bebas bug dan disempurnakan dari cracker MD5 di atas yang membaca file yang berisi daftar kata sandi hash dan memeriksanya terhadap kata hash dari daftar kata kamus Bahasa Inggris. Semoga bermanfaat.

Saya mengunduh kamus bahasa Inggris dari tautan berikut 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
sumber