TypeError nasıl düzeltilir: Karma işleminden önce Unicode nesneleri kodlanmalıdır?


295

Bu hatayı aldı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

Python 3.2.2 bu kodu yürütmeye çalıştığınızda :

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

Ben 'rb' ile bir dosya açmak davam yardımcı oldu bulundu.
dlamblin

Yanıtlar:


299

Muhtemelen kodlayan bir karakter arıyor wordlistfile.

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

Veya satır satır çalışıyorsanız:

line.encode('utf-8')

3
open(wordlist,"r",encoding='utf-8')neden belirli kodlama ile açık kullanıldığında, kodlama kod çözücü kodek belirtilir, bu seçenek olmadan platforma bağlı kodlama kullanır.
Tanky Woo

129

Sen tanımlamak için gereken encoding formatgibi utf-8, bu kolay bir yol deneyin,

Bu örnek SHA256 algoritmasını kullanarak rastgele bir sayı üretir:

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

18

Parolayı kaydetmek için (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
Bu satır şifreyi kullanmayı imkansız hale getirir. password_salt = os.urandom (32) .hex () Bilinen sabit bir değer olmalıdır, ancak yalnızca sunucu için gizli olabilir. Lütfen beni düzeltin veya kodunuza uyarlayın.
Yash

1
@Yash ile aynı fikirdeyim Ya her karma için kullandığınız tek bir tuzunuz var (en iyisi değil) ya da her karma için rastgele bir tuz üretiyorsanız, karşılaştırma için tekrar kullanmak üzere karma ile birlikte saklamanız gerekir
Carson Evans

15

Hata zaten ne yapmanız gerektiğini söylüyor. MD5 baytlarda çalışır, bu nedenle Unicode dizesini bytes, örneğin ile kodlamanız gerekir line.encode('utf-8').


11

Lütfen önce bu cevaba bir göz atın .

Şimdi, hata mesajı açık: Yalnızca (eskiden ne bayt değil, Python dizeleri kullanabilirsiniz unicodesahip böylece tercih kodlamasıyla dizeleri kodlamak için, Python <3): utf-32, utf-16, utf-8veya kısıtlı biri bile 8- bit kodlamaları (bazılarının kod sayfaları dediği şeyler).

Sözcük listesi dosyanızdaki baytların, dosyadan okurken Python 3 tarafından otomatik olarak Unicode'a kodu çözülüyor. Yapmanızı öneririm:

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

md5 algoritmasına aktarılan kodlanmış veriler, temel dosya gibi kodlanır.


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

6

Dosyayı ikili modda açabilirsiniz:

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

bu satırı kodlamak benim için düzeltti.

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

0

Tek satırlık bir dize ise. b veya B ile sarın. örneğin:

variable = b"This is a variable"

veya

variable2 = B"This is also a variable"

-3

Bu program, karma şifrelerin listesini içeren dosyayı okuyan ve İngilizce sözlük kelime listesinden karma kelimeye karşı kontrol eden yukarıdaki MD5 krakerinin hatasız ve geliştirilmiş sürümüdür. Umarım faydalıdır.

İngilizce sözlüğü aşağıdaki bağlantıdan indirdim 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.