«TypeError: объекты Unicode должны быть закодированы перед хэшированием»

У меня есть эта ошибка

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 :

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

  • urllib.urlencode не любит значения unicode: как об этом обходном пути?
  • Python: данные против текста?
  • Поиск символов Юникода в Python
  • Удалить символы с подчеркнутыми символами - Python
  • Как работать с строкой unicode в URL-адресе в python3?
  • Как преобразовать Unicode в верхний регистр, чтобы распечатать его?
  • Литералы Unicode, которые работают в python 3 и 2
  • Как установить кодировку sys.stdout в Python 3?
  • 6 Solutions collect form web for “«TypeError: объекты Unicode должны быть закодированы перед хэшированием»”

    Вероятно, он ищет кодировку символов из wordlistfile .

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

    Или, если вы работаете поэтапно:

     line.encode('utf-8') 

    Вам необходимо определить encoding format такой как utf-8 , попробуйте этот простой способ,

    В этом примере генерируется случайное число с использованием алгоритма SHA256:

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

    Ошибка уже говорит, что вам нужно делать. MD5 работает с байтами, поэтому вам нужно кодировать строку Unicode в bytes , например, с помощью line.encode('utf-8') .

    Пожалуйста, сначала взгляните на этот ответ.

    Теперь сообщение об ошибке становится понятным: вы можете использовать только байты, а не строки Python (то, что раньше использовалось для unicode в Python <3), поэтому вам нужно кодировать строки с предпочтительной кодировкой: utf-32 , utf-16 , utf-8 или даже одно из ограниченных 8-битных кодировок (что некоторые могли бы назвать кодовыми страницами).

    Байты в вашем файле списка слов автоматически декодируются в Unicode Python 3 при чтении из файла. Я предлагаю вам:

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

    так что кодированные данные, помещенные в алгоритм md5, кодируются точно так же, как и основной файл.

    Вы можете открыть файл в двоичном режиме:

     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 

    Чтобы сохранить пароль (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() 
    Python - лучший язык программирования в мире.