Git提交签名本地验证:ECDSA哈希值z的计算方法问询
手动计算Git提交签名的ECDSA目标哈希(z值)
问题出在这:你直接对commit文件算SHA256,得到的是原始commit数据的哈希,但GPG在计算ECDSA的z值前,会按照OpenPGP的规范给待签名的commit数据做一层预处理,这才是哈希的真正输入。
具体操作步骤
假设你手里的commit文件是Git提交对象的原始二进制内容(可以用git cat-file commit <提交哈希> > commit导出,别用文本编辑器修改,避免换行符或编码变更),按下面步骤计算:
获取commit文件的字节长度
运行这条命令得到文件的字节数,记为L:wc -c < commit构造GPG用的哈希输入并计算SHA256
GPG对二进制数据签名时,会给原始数据添加前缀:先是一个\x00字节,接着是4字节大端格式的文件长度,最后拼接原始commit内容。直接用这条命令一步到位:(echo -n -e '\x00' && printf "%08x" $(wc -c < commit) | xxd -r -p && cat commit) | sha256sum拆解命令逻辑:
echo -n -e '\x00':输出前缀的0字节printf "%08x" ... | xxd -r -p:把字节长度转换为4字节大端的二进制格式cat commit:拼接原始commit数据- 最后通过管道传给
sha256sum计算哈希
对比验证
把上面得到的哈希值和gpg --verify --debug=7 sig commit输出中的目标哈希对比,完全一致的话,这个就是ECDSA规范里需要的z值。
额外注意
- 如果你的GPG密钥使用的是secp384r1这类曲线,对应的哈希算法是SHA384,只需把命令里的
sha256sum换成sha384sum即可。 - 务必保证commit文件是原始二进制格式,别用记事本类工具打开保存,否则内容或长度会发生变化,导致哈希值不符。
内容的提问来源于stack exchange,提问作者Coco
相关产品推荐
相关产品推荐

