SHA256 给出意想不到的结果
SHA256 giving unexpected result
我正在尝试使用 hashlib 对一个字节数组进行哈希处理,但我无法得到符合我预期的哈希值(通过使用在线 SHA256 函数确认答案)。
这是我进行哈希处理的方式:
hashedData = hashlib.sha256(input[0:32]).hexdigest()
print('hash = ', hashedData)
在进行散列之前,我打印出输入数据的十六进制摘要:
print('input = ', input[0:32].hex())
当我与几个在线sha256函数进行比较时,输出不匹配。对于这个例子,正确的散列应该是:
我做错了什么?
您需要为 sha256 提供编码输入。输入必须作为字节串传递。使用encode()
方法将其转换为bytestring格式。
hashed = hashlib.sha256("test".encode()).hexdigest()
print(hashed)
在你的例子中使用 bytes() 方法来编码你的字节数组:
hash_input=bytes(input)
结果:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Actual res from :9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
在您的代码中散列的数据似乎是一个字节串,但您在您使用的任何在线工具上散列的数据是您的 .hex()
结果,即 ASCII 十六进制值。它们不是同一件事。请参阅下面的比较,重现您的两个结果:
from binascii import unhexlify
import hashlib
data1 = b'ff815ef617d058df5d16f96a73591e4d12ac358cc113a8c74d8f4ac5843dd921'
data2 = unhexlify(data1)
print(f'{data1=}\n{data2=}')
hashed1 = hashlib.sha256(data1).hexdigest()
hashed2 = hashlib.sha256(data2).hexdigest()
print(f'{hashed1=}\n{hashed2=}')
输出:
data1=b'ff815ef617d058df5d16f96a73591e4d12ac358cc113a8c74d8f4ac5843dd921'
data2=b'\xff\x81^\xf6\x17\xd0X\xdf]\x16\xf9jsY\x1eM\x12\xac5\x8c\xc1\x13\xa8\xc7M\x8fJ\xc5\x84=\xd9!'
hashed1='e417268832671b04efa73ba4093572975e084b8b33bfdcb4f9345093f80106ff'
hashed2='56e8d96c55150870ecc84c9a355de617993e21e29c9edcf3caa369b252fd2108'
我正在尝试使用 hashlib 对一个字节数组进行哈希处理,但我无法得到符合我预期的哈希值(通过使用在线 SHA256 函数确认答案)。
这是我进行哈希处理的方式:
hashedData = hashlib.sha256(input[0:32]).hexdigest()
print('hash = ', hashedData)
在进行散列之前,我打印出输入数据的十六进制摘要:
print('input = ', input[0:32].hex())
当我与几个在线sha256函数进行比较时,输出不匹配。对于这个例子,正确的散列应该是:
我做错了什么?
您需要为 sha256 提供编码输入。输入必须作为字节串传递。使用encode()
方法将其转换为bytestring格式。
hashed = hashlib.sha256("test".encode()).hexdigest()
print(hashed)
在你的例子中使用 bytes() 方法来编码你的字节数组:
hash_input=bytes(input)
结果:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Actual res from :9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
在您的代码中散列的数据似乎是一个字节串,但您在您使用的任何在线工具上散列的数据是您的 .hex()
结果,即 ASCII 十六进制值。它们不是同一件事。请参阅下面的比较,重现您的两个结果:
from binascii import unhexlify
import hashlib
data1 = b'ff815ef617d058df5d16f96a73591e4d12ac358cc113a8c74d8f4ac5843dd921'
data2 = unhexlify(data1)
print(f'{data1=}\n{data2=}')
hashed1 = hashlib.sha256(data1).hexdigest()
hashed2 = hashlib.sha256(data2).hexdigest()
print(f'{hashed1=}\n{hashed2=}')
输出:
data1=b'ff815ef617d058df5d16f96a73591e4d12ac358cc113a8c74d8f4ac5843dd921'
data2=b'\xff\x81^\xf6\x17\xd0X\xdf]\x16\xf9jsY\x1eM\x12\xac5\x8c\xc1\x13\xa8\xc7M\x8fJ\xc5\x84=\xd9!'
hashed1='e417268832671b04efa73ba4093572975e084b8b33bfdcb4f9345093f80106ff'
hashed2='56e8d96c55150870ecc84c9a355de617993e21e29c9edcf3caa369b252fd2108'