如何手动生成与go.sum条目匹配的SHA256校验和?
解决手动生成go.sum哈希值的问题
核心逻辑说明
go.sum中的h1:哈希并非直接对文件内容做SHA256,而是遵循Go模块的校验和计算规则,分两种场景处理:
1. 生成模块整体的哈希(对应无/go.mod后缀的条目)
针对github.com/foo/bar v0.0.0-20231129062549-b7ab892f9094的哈希,Go的计算逻辑是:
- 遍历模块目录下所有非隐藏文件,按文件名字典序排序
- 对每个文件,拼接
regular $文件名\n(可执行文件替换为executable)+ 文件原始内容 - 将所有拼接后的内容合并,计算SHA256哈希,再转成Base64编码,前缀加上
h1:就是go.sum里的值
手动生成命令
进入模块目录后执行:
cd ~/go/pkg/mod/github.com/foo/bar@v0.0.0-20231129062549-b7ab892f9094/ find . -type f -not -name ".*" | sort | while read f; do echo -n "regular ${f#./}"$'\n' cat "$f" done | sha256sum | awk '{print $1}' | xxd -r -p | base64
输出的Base64字符串前加上h1:即可匹配go.sum中的对应条目。
2. 生成go.mod单独的哈希(对应/go.mod后缀的条目)
针对github.com/foo/bar@v0.0.0-20231129062549-b7ab892f9094/go.mod的哈希,只需对go.mod文件内容计算SHA256后转Base64,注意文件换行符必须是LF(避免Windows下CRLF格式干扰):
手动生成命令
cat ~/go/pkg/mod/github.com/foo/bar@v0.0.0-20231129062549-b7ab892f9094/go.mod | sha256sum | awk '{print $1}' | xxd -r -p | base64
同样在结果前加h1:就是目标哈希值。
你的尝试失败的原因
- 第一次尝试:没有按规则添加文件元信息(文件模式、路径),也未对文件排序,直接拼接所有文件内容,输入与Go的计算数据源完全不符
- 第二次尝试:仅计算了单个文件的哈希,但模块整体哈希是基于所有文件的组合内容,结果自然不匹配
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

