无法用Python复现Go中SHA256哈希的Base32编码结果求助
问题分析与解决方案
哦,我一眼就发现问题所在了!你在Python里踩了一个很容易忽略的小坑:Go代码是对SHA256生成的原始二进制哈希值做Base32编码,但你在Python里先把哈希转成了十六进制字符串,再对这个字符串进行编码,这直接导致了最终结果的差异。
具体差异拆解
- Go端:
chksum[:]是SHA256哈希生成的32字节原始二进制数据,直接传入Base32编码器 - Python端:你用了
sha256.hexdigest(),得到的是64字符的十六进制文本字符串,再把这个字符串转成字节去编码——相当于编码的是哈希的"文本表示",而非哈希本身的原始二进制数据
修正后的Python代码
只需要把hexdigest()换成digest(),获取原始二进制哈希值即可:
#!/usr/bin/env python import hashlib import base64 namespace = "my-ns" policyName = "default-deny" sha256 = hashlib.sha256() # Python3需要显式编码为字节,Python2可省略.encode('utf-8') sha256.update((namespace + policyName).encode('utf-8')) chksum = sha256.digest() # 获取原始二进制哈希数据 print(sha256.hexdigest()) # 打印十六进制哈希,和Go保持一致 # Python3需要decode转成字符串输出,Python2可直接打印base64.b32encode(chksum) print(base64.b32encode(chksum).decode('utf-8')) print(base64.b32encode(b"abc").decode('utf-8'))
验证结果
修正后,Python的输出会和Go完全匹配:
dd684919ef4a1362b841409f5255ec963bd53d353804114779c4e6d66641eb28 3VUESGPPJIJWFOCBICPVEVPMSY55KPJVHACBCR3ZYTTNMZSB5MUA==== MFRGG===
补充说明
为什么简单字符串"abc"的编码结果一致?因为你在Python里用了bytearray("abc")(Python3等价于b"abc"),这和Go的[]byte("abc")逻辑完全一致——都是直接对原始字节做编码,所以结果自然匹配。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

