如何在Python中使用sha256哈希

时间:2014-10-23 23:48:34

标签: python sha256

我正在尝试读取密码文件。然后我尝试计算每个密码的哈希值,并将其与我已经拥有的哈希值进行比较,以确定我是否发现了密码。但是我不断得到的错误消息是“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!")

有人可以帮忙并提供解释吗?

2 个答案:

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