如何在Python中使用sha256散列

2024-05-29 09:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想读入一个密码文件。然后我试图计算每个密码的散列,并将其与一个散列进行比较,以确定我是否发现了密码。但是,我一直收到的错误消息是“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!")

有人能帮忙解释一下吗?


Tags: 对象代码from消息密码编码错误line
1条回答
网友
1楼 · 发布于 2024-05-29 09:40:13

错误消息的意思正是它所说的:您有一个Unicode字符串。不能SHA-256-hash Unicode字符串,只能哈希字节。

但是为什么要有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"))修复所有这些问题。

但是,当您希望输出Århus is one of the words时,您将得到类似b'\xc3\x85rhus' is one of the words的输出。那是因为你现在有字节,而不是字符串。由于Python不再为您解码,因此您需要手动执行此操作。若要使用某些情况下不将编码指定为open时可以使用的相同默认编码,只需在不带参数的情况下调用decode。所以:

print(line.rstrip().decode(), "is one of the words")

相关问题 更多 >

    热门问题