我正在尝试读取密码文件。然后我尝试计算每个密码的哈希值,并将其与我已经拥有的哈希值进行比较,以确定我是否发现了密码。但是我不断得到的错误消息是“TypeError:必须在散列之前对Unicode对象进行编码”。这是我的代码:
from hashlib import sha256
with open('words','r') as f:
for line in f:
hashedWord = sha256(line.rstrip()).hexdigest()
if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
print(line + "is one of the words!")
有人可以帮忙并提供解释吗?
答案 0 :(得分:9)
错误消息的含义正是它所说的:你有一个Unicode字符串。您不能对一个Unicode字符串进行SHA-256哈希处理,只能对字节进行哈希处理。
但为什么你有一个Unicode字符串?因为您在文本模式下打开文件,这意味着您隐式要求Python将该文件中的字节(使用您的默认编码)解码为Unicode。如果要获取原始字节,则必须使用二进制模式。
换句话说,只需更改此行:
with open('words','r') as f:
......来:
with open('words', 'rb') as f:
您可能会注意到,一旦解决了这个问题,print
行会引发异常。为什么?因为您正在尝试将bytes
添加到str
。您还错过了一个空格,并且您正在打印未剥离的线条。您可以使用print
的两个参数来解决所有问题(如print(line.rstrip(), "is one of the words")
中所述)。
但是,当您希望打印出b'\xc3\x85rhus' is one of the words
时,您会获得Århus is one of the words
之类的输出。那是因为你现在有字节而不是字符串。由于Python不再为您解码,因此您需要手动执行此操作。要使用相同的默认编码,有时无法在open
指定编码时使用,只需在没有参数的情况下调用decode
。所以:
print(line.rstrip().decode(), "is one of the words")
答案 1 :(得分:7)
如果要从文件中读取信息作为Unicode字符串,则此代码行将起作用:
hashedWord = sha256(line.encode('utf-8')).hexdigest()