提问人:JohnnyFromBF 提问时间:9/28/2011 最后编辑:AugustinJohnnyFromBF 更新时间:1/14/2021 访问量:560088
如何更正TypeError:Unicode对象必须在哈希之前进行编码?
How to correct TypeError: Unicode-objects must be encoded before hashing?
问:
我有这个错误:
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()
答:
错误已经说明了您必须执行的操作。 MD5 对字节进行操作,因此您必须将 Unicode 字符串编码为 ,例如使用 .bytes
line.encode('utf-8')
它可能正在查找来自 的字符编码。wordlistfile
wordlistfile = open(wordlist,"r",encoding='utf-8')
或者,如果您正在逐行工作:
line.encode('utf-8')
编辑
根据下面的评论和这个答案。
我上面的回答假设所需的输出是来自文件的输出。如果你对工作感到满意,那么你最好使用 .但重要的是要记住,如果您将其与 的输出进行比较,则不应使用 。 输出 a 和 不能直接与 bytes 对象进行比较: 。(这个话题还有很多,但我没有时间ATM)。str
wordlist
bytes
open(wordlist, "rb")
hashfile
rb
hexdigest
hashlib.md5(value).hashdigest()
str
'abc' != b'abc'
还应该注意的是,这一行:
line.replace("\n", "")
应该是
line.strip()
这适用于 bytes 和 str。但是,如果您决定简单地转换为 ,则可以将该行更改为:bytes
line.replace(b"\n", b"")
评论
open(wordlist,"r",encoding='utf-8')
为什么使用带有特定编码的 Open,编码被指定为解码编解码器,如果没有此选项,它使用与平台相关的编码。
encoding
str
str
str
line.encode('utf-8')
'rb'
line
bytes
.replace("\n", '')
str
¯\_(ツ)_/¯
请先看看这个答案。
现在,错误消息很明确:您只能使用字节,而不能使用 Python 字符串(以前在 Python < 3 中是这样),因此您必须使用您喜欢的编码对字符串进行编码:、,甚至是受限制的 8 位编码之一(有些人可能称之为代码页)。unicode
utf-32
utf-16
utf-8
当您从文件中读取时,Python 3 会自动将单词列表文件中的字节解码为 Unicode。我建议你这样做:
m.update(line.encode(wordlistfile.encoding))
因此,推送到 MD5 算法的编码数据的编码与底层文件完全相同。
评论
bytes
你必须定义像 ,
试试这个简单的方法,encoding format
utf-8
此示例使用 SHA256 算法生成一个随机数:
>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
您可以以二进制模式打开文件:
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
评论
wordlist
bytes
要存储密码 (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()
评论
该程序是上述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()
import hashlib
string_to_hash = '123'
hash_object = hashlib.sha256(str(string_to_hash).encode('utf-8'))
print('Hash', hash_object.hexdigest())
评论
对这一行进行编码为我修复了它。
m.update(line.encode('utf-8'))
如果是单行字符串。用 b 或 B 包裹它,例如:
variable = b"This is a variable"
或
variable2 = B"This is also a variable"
评论