如何纠正 TypeError:Unicode 对象必须在散列之前进行编码?

问题描述 投票:0回答:10

我有这个错误:

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:
  # 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()
python python-3.x unicode syntax-error hashlib
10个回答
441
投票

它可能正在寻找来自

wordlistfile
的字符编码。

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

或者,如果您正在逐行工作:

line.encode('utf-8')

编辑

根据下面的评论和这个答案

我上面的回答假设所需的输出是来自

str
文件的
wordlist
。如果您习惯在
bytes
中工作,那么您最好使用
open(wordlist, "rb")
。但重要的是要记住,如果您将其与
hashfile
的输出进行比较,您的 rb 不应该
 使用 
hexdigest
hashlib.md5(value).hashdigest()
 输出 
str
 并且不能直接与字节对象进行比较:
'abc' != b'abc'
。 (这个话题还有很多,但我没有时间 ATM)。

还应该注意这一行:

line.replace("\n", "")
应该是

line.strip()
这适用于字节和字符串。但如果您决定简单地转换为 

bytes

,那么您可以将该行更改为:

line.replace(b"\n", b"")
    

183
投票
您必须像

encoding format

一样定义
utf-8
, 
试试这个简单的方法,

此示例使用 SHA256 算法生成随机数:

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

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

23
投票
错误已经说明了你必须做什么。 MD5 对字节进行操作,因此您必须将 Unicode 字符串编码为

bytes

,例如与 
line.encode('utf-8')


19
投票
存储密码(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()
    

16
投票
编码这一行为我修复了它。

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

15
投票
请先看一下

那个答案。

现在,错误消息很明确:您只能使用字节,而不能使用 Python 字符串(Python 中曾经是

unicode

utf-32< 3), so you have to encode the strings with your preferred encoding:
utf-16
utf-8
,甚至是受限制的 8 位编码之一(有些人可能称之为代码页)。

当您从文件中读取时,Python 3 会自动将单词列表文件中的字节解码为 Unicode。我建议你这样做:

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

以便推送到 md5 算法的编码数据与底层文件完全一样编码。


13
投票
您可以以二进制模式打开文件:

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
    

7
投票
如果是单行字符串。用 b 或 B 包裹它。例如:

variable = b"This is a variable"

variable2 = B"This is also a variable"
    

-4
投票
该程序是上述 MD5 破解程序的无错误和增强版本,它读取包含散列密码列表的文件,并将其与英语词典单词列表中的散列单词进行检查。希望对您有帮助。

我从以下链接下载了英语词典

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()
    
© www.soinside.com 2019 - 2024. All rights reserved.