You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:27:46