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

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')

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'

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

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').


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.


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

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

6

penyandian baris ini memperbaikinya untuk saya.

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

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"

-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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.