2011-09-28 21 views
130

Tôi có lỗi này:Cách sửa TypeError: Các đối tượng Unicode phải được mã hóa trước khi băm?

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: 
     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() 
+0

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

Trả lời

132

Có thể tìm kiếm 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ở line-by-line:

line.encode('utf-8') 
+1

'mở (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 dựa trên nền tảng. –

10

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

+52

Bị bỏ phiếu, vì câu "Lỗi đã cho biết bạn phải làm gì." là thô lỗ và không thêm gì cả. – timthelion

+12

@timthelion Nó thêm ý nghĩa rằng đọc hiểu là một điều kiện tiên quyết để lập trình. Khủng khiếp, tôi biết. –

+11

@timthelion Thực sự. Bạn không có gì tốt hơn để làm hơn là thông qua phán xét đạo đức về từ ngữ của một câu trả lời của ~ 4 tuổi. Và nó không thô lỗ (thực tế) và nó hữu ích (bạn có thể đọc tin nhắn theo cách giúp bạn tìm ra giải pháp). – sehe

8

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

Bây giờ, 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à unicode bằng Python < 3), vì vậy bạn phải mã hóa các chuỗi với mã hóa của bạn ưa thích: utf-32, utf-16, utf-8 hoặc thậm chí một trong các mã hóa 8 bit bị hạn chế (những gì một số có thể gọi là mã hóa).

Các byte trong tệp danh sách từ của bạn được tự động giải mã thành Unicode bằng Python 3 khi bạn đọc từ tệp. Tôi khuyên bạn nên làm:

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

để dữ liệu được mã hóa được chuyển sang thuật toán md5 được mã hóa chính xác như tệp cơ bản.

45

Bạn phải có để xác định encoding format như 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 cách sử dụng thuật toán SHA256:

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

Bạn có thể mở tập tin trong 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 
6

Để lưu trữ 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() 
Các vấn đề liên quan