在git中签名标记的意义是什么?

在git中签名标记的意义是什么?,git,Git,我是git的新手,我已经看到可以用gpg对标签进行签名。我了解公钥加密是如何工作的,我也了解如何对标记进行签名,但这样做的意义是什么?对标记进行签名的意义在于,现在任何拥有您的公钥的人都可以证明您已批准该特定提交为该程序的特定版本。如果他们碰巧相信您是该软件包的官方发布源,那么他们知道他们得到的是该软件包的官方版本,而不是可能被攻击者后门攻击或在传输过程中损坏的随机版本。了解该软件包的基本知识,说明签名标签的价值 下图借用了,描绘了一个特定的快照。着色框是git对象。左侧的提交对象引用了一棵树。

我是git的新手,我已经看到可以用gpg对标签进行签名。我了解公钥加密是如何工作的,我也了解如何对标记进行签名,但这样做的意义是什么?

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

了解该软件包的基本知识,说明签名标签的价值

下图借用了,描绘了一个特定的快照。着色框是git对象。左侧的提交对象引用了一棵树。将树想象成文件系统目录,因此树对象引用其他树和blob。blob对象存储文件内容

每个git对象都有一个SHA1,一个从该对象内容派生的唯一的40个字符的十六进制摘要。对象上方的缩写十六进制字符串表示各自的SHA1

Git对象是不可变的:即使更改对象内容的一点也会更改其名称。一路上都是沙斯。对blob的任何更改都需要一个新的树,然后又需要一个新的提交,因此不可能同时插入不同的内容和内容。只知道提交的SHA1可以为您提供一个精确的、经过完整性检查的树快照

提交还涉及其直接父级(或在合并的情况下涉及多个父级),因此保证更为有力。在提交的历史记录中的任何位置更改单个位也会更改其SHA1。只知道一次提交的SHA1会给您提供大量的信息:一个精确的历史背景下的精确树,一直追溯到第一次提交


任何人都可以创建提交,任何人都可以自称是,比如说,Linus Torvalds。重要的是要知道哪些提交是可信的。引用提交的签名标记将提供上述所有信息以及可验证的真实性。许多项目使用签名标签作为正式发布的盖章方式。

嗨,布莱恩,非常感谢你的回答。因此,基本上这意味着我可以从不可信的源代码中签出一个版本,并且仍然确保代码未被修改,对吗?如果这对标记有用,为什么它不是提交和推/拉操作的通用过程呢?@Ken有几个原因。首先,它会给开发过程增加摩擦,或者降低安全性。您需要不断键入GPG密钥密码,或者加载一个代理并存储该密码,这将增加您的漏洞窗口。此外,人们不一定要以加密方式承诺支持仍处于开发周期中的补丁;也许他们会认为一个补丁是一个坏主意,只想删除那个补丁,而不必担心其他人因为签名而认为它是官方的。此外,补丁经常被重定基址或以其他方式重写。当你这样做的时候,你将不得不删除提交人的原始签名(因为你不能用他们的密钥签名),也许还需要添加你自己的签名,但随后就会开始混淆每个人的签名意味着什么(这是否意味着他们编写了补丁?批准了吗?审查了吗?)。通过只对发布进行签名,可以减少混乱;您只是声明此标记对应于此正式版本,该版本已通过项目的任何代码审查和测试过程。如果您愿意,您可以使用
git notes
和一些助手脚本自己实现每个提交的签名。Git深受其影响的分布式修订控制系统(提交的基本表示形式为对树的链式引用,其父级由SHA-1总和标识,该表示形式取自Montone)确实会对每个提交进行签名,如果你对这个功能感兴趣的话,你可以看看Montone。有人知道Git社区书中使用了什么软件来创建优秀的图表吗?@trojanfoe我也想知道。也许它应该有自己的堆栈溢出问题!完成:没错,但既然如此,你为什么还要签呢。因为提交散列将说明一切,不管它是否可信。如果SHA-1是相等的,那么它是值得信赖的。无论如何,您需要拥有所有者的公钥进行验证,为什么不使用SHA-1和verify呢。为什么会有一个全新的概念?关于密码学的类似问题。se:。