Làm cách nào để sửa TypeError: Các đối tượng Unicode phải được mã hóa trước khi băm?


295

Tôi có lỗi này:

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

khi tôi cố gắng thực thi mã này trong 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()

Tôi thấy việc mở một tệp với 'rb' đã giúp trường hợp của tôi.
dlamblin

Câu trả lời:


299

Có lẽ nó đang tìm kiếm một mã hóa ký tự từ wordlistfile.

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

Hoặc, nếu bạn đang làm việc trên cơ sở từng dòng:

line.encode('utf-8')

3
open(wordlist,"r",encoding='utf-8')Tại sao sử dụng mở với mã hóa cụ thể, mã hóa được chỉ định codec giải mã, không có tùy chọn này, nó sử dụng mã hóa phụ thuộc vào nền tảng.
Tanky Woo

129

Bạn phải xác định encoding formatnhư thế utf-8, Hãy thử cách dễ dàng này,

Ví dụ này tạo ra một số ngẫu nhiên bằng thuật toán SHA256:

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

18

Để lưu mật khẩu (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
Dòng này làm cho mật khẩu không thể sử dụng. password_salt = os.urandom (32) .hex () Nó nên là một giá trị cố định đã biết nhưng nó chỉ có thể là bí mật cho máy chủ. Vui lòng sửa cho tôi hoặc điều chỉnh nó theo mã của bạn.
Yash

1
Tôi đồng ý với @Yash Bạn có một loại muối bạn sử dụng cho mỗi hàm băm (không phải loại tốt nhất) hoặc nếu bạn tạo một loại muối ngẫu nhiên cho mỗi hàm băm, bạn phải lưu trữ nó với hàm băm để sử dụng lại sau này để so sánh
Carson Evans

15

Các lỗi đã nói những gì bạn phải làm. MD5 hoạt động trên byte, do đó bạn phải mã hóa chuỗi Unicode bytes, ví dụ như với line.encode('utf-8').


11

Hãy dành một cái nhìn đầu tiên câu trả lời.

Bây giờ, các thông báo lỗi là rõ ràng: bạn chỉ có thể sử dụng byte, không dây Python (những gì đã từng là unicodebằng Python <3), vì vậy bạn phải mã hóa các chuỗi với mã hóa ưa thích của bạn: utf-32, utf-16, utf-8hoặc thậm chí một trong những hạn chế 8- mã hóa bit (cái mà một số người có thể gọi là tiền mã hóa).

Các byte trong tệp danh sách từ của bạn đang được giải mã tự động sang Unicode bởi Python 3 khi bạn đọc từ tệp. Tôi đề nghị bạn làm:

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

để dữ liệu được mã hóa được đẩy đến thuật toán md5 được mã hóa chính xác như tệp bên dưới.


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

6

Bạn có thể mở tệp ở chế độ nhị phân:

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


0

Nếu đó là một chuỗi dòng đơn. bọc nó bằng b hoặc B. ví dụ:

variable = b"This is a variable"

hoặc là

variable2 = B"This is also a variable"

-3

Chương trình này là phiên bản không có lỗi và nâng cao của trình bẻ khóa MD5 ở trên, đọc tệp chứa danh sách các mật khẩu được băm và kiểm tra xem nó có bị băm từ danh sách từ trong từ điển tiếng Anh không. Hy vọng nó hữu ích.

Tôi đã tải xuống từ điển tiếng Anh từ liên kết sau 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.