无法在 python3 中使用 hashlib 将 sha1 编码为十六进制

Cannot encode sha1 to hex using hashlib in python3

我正在尝试使用 python3 中的 hashlib 将 sha1 字符串编码为十六进制。我收到一个属性错误。

程序在python2成功运行。

gesture = file.read(hashlib.sha1().digest_size).encode('hex')
AttributeError: 'bytes' object has no attribute 'encode'

文件:???ӷJ?*L??R?????T%(这是一个未加盐的 SHA1 哈希值)

二进制读取时的文件:b'\xae\x93\xf0\xd3\xb7\x7fJ\xb4*L\x90\xdeR\x91\xa8\xa1\x9b\xb6T\x0f'

我正在 rb 模式下打开它

哈希本身将有一个 hexdigest 方法来产生你想要的结果。但是您发布的代码似乎试图将方法应用于 file.read() 中的 return 值,而不是摘要对象。我猜你的意思可能是

sha = hashlib.sha1()
buffer = file.read(sha.digest_size)
sha.update(buffer)
gesture = sha.hexdigest()

尝试使用摘要大小来指定要读取的字节数也很可疑。通常你应该读取整个文件,不管它有多大或多小; digest.size 是 SHA1 算法的 输出 的长度,而不是它的输入。

更传统的方法是

with open(filename, 'rb') as f:
    sha = hashlib(f.read())
gesture = sha.hexdigest()

如果您的目标是将 SHA1 散列的二进制表示读回内存,hashlib 不直接支持。哈希算法通常被设计成不可能或至少非常耗费资源来从摘要中重建原始对象;但当然,如果你用 pickle 或类似的方式保存一个 hashlib 对象,你应该能够读回它并基本上从你离开的地方继续(尽管我相信运输泡菜可能会有问题在某些 Python 版本之间)。

如果你只想要字节序列的十六进制表示,那就是What's the correct way to convert bytes to a hex string in Python 3?

with open(filename, 'rb') as f:
    buffer = f.read()
hexbytes = buffer.hex()

你可以这样做:

with open("your_file", "rb") as f:
    Hash = f.read(hashlib.sha1().digest_size).hex()

这里hex是classbytes的一个方法。