Python 中 sha256 的十六进制字符串与二进制字符串处理不同

0 投票
1 回答
1435 浏览
提问于 2025-04-18 03:09

我有一个十六进制的值,我通过以下方式得到了它的二进制表示:

In [10]: binascii.unhexlify('950ef5cce9c32676ab67998e2245f682624f9abce6bb1392b67204159b82c020')
Out[10]: '\x95\x0e\xf5\xcc\xe9\xc3&v\xabg\x99\x8e"E\xf6\x82bO\x9a\xbc\xe6\xbb\x13\x92\xb6r\x04\x15\x9b\x82\xc0 '

为了确认我自己的理解,我可以把它转换回原来的值:

In [11]: binascii.hexlify('\x95\x0e\xf5\xcc\xe9\xc3&v\xabg\x99\x8e"E\xf6\x82bO\x9a\xbc\xe6\xbb\x13\x92\xb6r\x04\x15\x9b\x82\xc0 ')
Out[11]: '950ef5cce9c32676ab67998e2245f682624f9abce6bb1392b67204159b82c020'

现在我想要这个二进制值的 sha256 值。

In [12]: hashlib.sha256('\x95\x0e\xf5\xcc\xe9\xc3&v\xabg\x99\x8e"E\xf6\x82bO\x9a\xbc\xe6\xbb\x13\x92\xb6r\x04\x15\x9b\x82\xc0 ').hexdigest()
Out[12]: '74d0ef097a15e1699b2476de3b700e86f54d8d3ec65485382c01dc7984b46f96'

我本以为我最开始的十六进制值的 sha256 会和这个二进制的 sha256 一样,但结果并不是这样。

In [13]: hashlib.sha256('950ef5cce9c32676ab67998e2245f682624f9abce6bb1392b67204159b82c020').hexdigest()
Out[13]: 'cb0c91c3977b3433ce481511103e6454a5b781ec57849187aa0b2fe1b20e8078'

我猜测 sha256 是把接收到的值当作普通字符串来处理的,从字符串的角度来看,它们是不同的,但从十六进制和二进制的角度来看,它们是相同的。

有没有办法让 sha256 把接收到的值当作二进制值来处理,还是说我必须明确地这样做?我在文档中没有看到相关内容。只是想知道有没有这种方法,或者有没有人知道怎么做。

1 个回答

2

hashlib.sha256 是针对输入的字符串进行操作的。因为十六进制字符串和二进制字符串是不同的,所以它们的 sha256 结果也会不同。当你使用 sha256 的时候,要确保你传入的格式是一致的(无论是十六进制还是二进制都可以,但你必须始终使用同一种格式)。

撰写回答