为何Python不同模块中SHA3哈希计算结果存在差异?
为什么Python的hashlib.sha3_256和sha3模块的计算结果不一致?
这其实是个很容易踩坑的混淆点——你调用的根本不是同一个算法!
核心差异:SHA-3 vs 原始Keccak
Keccak是SHA-3竞赛的最终获胜算法,但在NIST将其标准化为正式SHA-3标准时,做了一处关键的规则修改:
- 原始Keccak算法使用的填充规则是
01:在消息末尾添加0x01字节,再补0到块大小 - NIST标准化后的SHA-3使用的填充规则是
10*1:最后一个字节是0x80,前面补0到块大小
你的测试代码里:
sha3.keccak_256()调用的是原始Keccak-256算法hashlib.sha3_256()调用的是NIST标准化后的SHA-3-256算法
这就是两者结果完全不同的本质原因。
直观验证示例
用同一个字符串测试,就能清晰看到差异:
import sha3 import hashlib test_str = "hello world" # 原始Keccak-256(sha3模块) k = sha3.keccak_256() k.update(test_str.encode('utf-8')) print("Keccak-256结果:", k.hexdigest()) # 输出:47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad # NIST SHA-3-256(hashlib) h = hashlib.sha3_256() h.update(test_str.encode('utf-8')) print("SHA-3-256结果:", h.hexdigest()) # 输出:644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938
如何得到一致的结果?
如果你需要和sha3模块的Keccak结果(或网络上多数Keccak工具)对齐,在Python 3.8+的hashlib中已经支持直接调用Keccak算法了:
# Python 3.8+ 可用 h = hashlib.new('keccak_256') h.update(test_str.encode('utf-8')) print("hashlib Keccak-256结果:", h.hexdigest()) # 输出和sha3.keccak_256完全一致:47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad
如果你的Python版本低于3.8,继续使用sha3模块的keccak_256就是正确的选择。
内容的提问来源于stack exchange,提问作者Alex G.P.
相关产品推荐
相关产品推荐

