在git中签署标签有什么意义?

45

我在git方面还比较新手,看到可以用gpg对标签进行签名。我理解公钥加密的原理并知道如何签署标签,但做这个有什么意义呢?


在密码学领域的类似问题:Git中对提交和标签进行加密签名的优缺点是什么? - sleske
2个回答

46

签署标签的目的在于,现在拥有您公钥的任何人都可以证明您已经批准了该特定提交作为该程序的特定版本。如果他们信任您是该软件包发布的官方来源,那么他们知道他们得到了该软件包的官方版本,而不是可能被攻击者后门或在传输过程中损坏的随机版本。


2
嗨,Brian,非常感谢你的回答。基本上这意味着我可以从不受信任的源代码中检出一个版本,并确保代码未被更改,对吧?现在,如果这对标签有用,为什么提交和推送/拉取操作不是常见的程序呢? - Ken
2
@Ken 有几个原因。首先,这将增加开发过程的摩擦或降低安全性。您将需要不断地输入GPG密钥密码,或者加载一个已存储它的代理程序,这会增加您的漏洞窗口。此外,人们并不一定希望在开发周期内就密切关注补丁,并对其进行数字签名;也许他们会认为补丁是个坏主意,并希望删除该补丁,而不必担心其他人误以为它是官方签名的。 - Brian Campbell
4
此外,补丁经常会被重新基于或重写。当你这样做时,你必须删除原始提交者的签名(因为你不能用他们的密钥签名),可能加上自己的签名,但这将使每个人的签名意义变得混淆(它表示他们编写了补丁?批准了它?审查了它?)。只有在发布时签署,可以减少混淆;你只是断言这个标签对应于这个官方版本,该版本已经通过项目中的任何代码审查和测试流程。 - Brian Campbell
2
如果你想的话,你可以使用 git notes 和一些辅助脚本来实现每个提交的签名。而且 Monotone,一个分布式版本控制系统,对 Git 产生了很大的影响(将提交的基本表示形式作为对树的链接引用,并通过 SHA-1 标识其父级是从 Monotone 中获取的),它确实采用了签署每个提交的方式,所以如果你对此功能感兴趣,可以尝试使用 Monotone。 - Brian Campbell

13
理解git对象模型的基础知识有助于理解签署标签的价值。
下面的图表来自Git社区书籍,描述了一个特定的快照。阴影框表示git对象。左侧的提交对象引用了一个树。将树视为文件系统目录,因此树对象引用其他树和blob。blob对象存储文件内容。

git objects

每个 Git 对象都有一个 SHA1,这是一个通过该对象的内容派生出的唯一 40 个字符的十六进制摘要。对象上方的缩写十六进制字符串表示它们各自的 SHA1。
Git 对象是不可变的:即使更改了对象内容中的一个位,也会更改其名称。无论如何都是 SHA1。更改 blob 中的任何内容都需要一个新树,然后依次创建一个新增提交,因此不可能同时滑入不同的内容和 避免检测。仅知道提交的 SHA1 就可以获得精确的、完整性检查的树形快照。
提交还引用了它的直接父级(或在合并的情况下多个父级),因此保证更强。在提交历史记录的任何位置更改单个位也会更改其 SHA1。仅知道单个提交的 SHA1 就可以获得大量信息:精确的树在第一个提交的完整历史背景下。
任何人都可以创建提交,也可以声称是 Linus Torvalds 等。知道哪些提交是值得信赖的很重要。指向提交的签名标签可以为您提供所有上述信息以及可验证的真实性。许多项目使用已签名的标签作为标记正式发布的方式。

3
有人知道Git社区书中使用的优秀图表所使用的软件是什么吗? - trojanfoe
@trojanfoe 我也想知道。也许它值得在 Stack Overflow 上提出一个新问题! - Greg Bacon
2
什么软件用于创建Git社区书中的图表? - trojanfoe
确实如此,但既然这样,为什么你需要签名呢?因为提交哈希将说明一切,无论它是否可信。如果SHA-1相等,则是可信的。无论如何,您需要拥有所有者的公钥才能进行验证,为什么不只使用SHA-1并进行验证呢?为什么需要一个全新的概念呢? - Abhisek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接