资讯详情

Git签名验过去了,还要核对谁签的

📅 2026/10/28 21:19:53 | 华诺云谱 👁 阅读
Git签名验过去了,还要核对谁签的
提交对象、签名和可信公钥名单是三类核验材料封面连线表示材料关联不表示把新公钥自动写进信任名单。签名验证通过回答的是“这些字节是否由对应私钥签出”。它还没有回答“这个公钥属于谁、是否有权签这类变更”。把签名里的Key ID直接加入可信列表相当于让来访者自己发通行证。信任名单来自验证对象之外下面是完整的Go标准库例子。它生成两把教学密钥以公钥摘要作为指纹只信任其中一把先核对名单再验签。这里没有实现Git对象格式也不是in-toto验证器。package main import ( crypto/ed25519 crypto/rand crypto/sha256 encoding/hex fmt ) func fingerprint(pub ed25519.PublicKey) string { sum : sha256.Sum256(pub) return hex.EncodeToString(sum[:]) } func verify(payload, signature []byte, pub ed25519.PublicKey, trusted map[string]bool) bool { if len(pub) ! ed25519.PublicKeySize || !trusted[fingerprint(pub)] { return false } return ed25519.Verify(pub, payload, signature) } func main() { pub, priv, err : ed25519.GenerateKey(rand.Reader) if err ! nil { panic(err) } otherPub, otherPriv, err : ed25519.GenerateKey(rand.Reader) if err ! nil { panic(err) } trusted : map[string]bool{fingerprint(pub): true} data : []byte(repositorydemo\ncommitteaching-sample\n) sig : ed25519.Sign(priv, data) if !verify(data, sig, pub, trusted) { panic(valid trusted signature rejected) } if verify(append(append([]byte{}, data...), !), sig, pub, trusted) { panic(tamper accepted) } if verify(data, ed25519.Sign(otherPriv, data), otherPub, trusted) { panic(untrusted signer accepted) } if verify(data, nil, pub, trusted) { panic(empty signature accepted) } fmt.Println(signature, tamper and signer-policy checks: passed) }图示表示签名、身份与策略都需要满足不代表程序执行的固定顺序。Git验签还要核对策略真实Git提交验证应使用Git支持的签名格式和验证工具确认对象、签名和允许签名人配置。信任文件由谁维护、密钥如何撤销、批准覆盖哪个仓库和分支都属于策略不能靠一个硬编码“可信Key ID”填补。Sigstore把身份与透明日志等机制纳入制品签名生态in-toto则表达供应链步骤和参与者。它们提供证据结构但正确验签仍不等于代码无漏洞更不等于签名人有权批准所有发布。本例只在内存中完成密钥、签名与信任名单检查没有读取真实Git提交、硬件密钥、证书或透明日志。它故意把最小边界摆出来有效签名与可信身份两项都不能省。参考Go Ed25519Git verify-commitGit SSH signer policySigstore概览in-toto项目
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑