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

时间:2019-04-06 12:26:07

标签: python python-3.x hashlib

我正在尝试使用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模式下打开它

2 个答案:

答案 0 :(得分:1)

散列本身将具有一个hexdigest方法,该方法可以产生所需的结果。但是您发布的代码似乎试图将方法应用于file.read()的返回值,而不是摘要对象。我猜你可能是说类似

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不直接支持它。哈希算法通常被设计为使其不可能或至少非常耗费资源,仅从摘要中重建原始对象。但是,当然,如果您使用hashlib或类似名称保存pickle对象,则应该能够读回该对象并基本上从上次中断的地方继续(尽管我认为运输酱菜可能会出现问题在某些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()

答案 1 :(得分:1)

您可以这样做:

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

这里hex是类bytes的方法。