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

如何用Python验证sum.golang.org提供的go.mod文件哈希值?

解决Go SumDB哈希验证不匹配的问题

问题出在Go SumDB的哈希计算规则上——它不是直接哈希go.mod文件的原始内容,而是哈希一个包含模块信息前缀的拼接字节流。

核心规则说明

SumDB的哈希输入是固定格式的字节组合:
"{模块路径} {版本号}/go.mod\n{go.mod文件内容}"
其中:

  • 模块路径与版本号之间为单个空格
  • 前缀末尾必须带Unix风格换行符\n
  • 直接拼接下载到的go.mod原始内容即可

你之前的代码直接哈希文件内容,忽略了这个前缀规则,导致哈希值不匹配。

修正后的Python代码

import base64
import requests
import hashlib

# 目标模块信息
module_path = "github.com/gin-gonic/gin"
version = "v1.6.2"

# SumDB中记录的哈希值
hash_from_sumdb = b'75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M='

# 下载对应版本的go.mod文件
mod_url = f'https://proxy.golang.org/{module_path}/@v/{version}.mod'
mod_content = requests.get(mod_url).content

# 构造SumDB要求的哈希输入字节流
hash_input = f"{module_path} {version}/go.mod\n".encode('utf-8') + mod_content

# 计算SHA256哈希并base64编码
hash_from_file = base64.b64encode(hashlib.sha256(hash_input).digest())

print("SumDB哈希值:", hash_from_sumdb)
print("本地计算哈希值:", hash_from_file)

# 验证哈希匹配
assert hash_from_file == hash_from_sumdb, "哈希验证失败"
print("哈希验证成功!")

注意细节

  • 前缀字符串不能有多余空格或换行,严格遵循模块路径 版本号/go.mod\n格式
  • 无需修改下载的go.mod内容,proxy返回的文件已经符合SumDB要求的换行格式
  • 确保编码统一使用UTF-8,避免出现字符编码差异

内容的提问来源于stack exchange,提问作者ElenaSh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:55:28