在Git中用密码对提交和标签进行签名的优缺点是什么?


109

因此,有人对我的工作进行了审查,他告诉我,我应该始终对自己的提交和标签进行加密签名。当被问到为什么时,他不知道向我解释它,并说“这是一件好事”。

为了避免出现明显的黑猩猩情形,我为什么要这么做呢?真的有这么多明显的优势而没有劣势吗?

有什么实际原因会使我想要签署我所做的每个提交和标记?


3
我认为是这样,所以有一个纸上的线索将提交与您联系在一起。不过,我之前从未使用git或任何其他源代码控制系统签署过一次提交。如果您的同事认为存在欺诈性欺诈的风险,则您的公司可能存在更大的安全问题。
詹姆斯

@James:这不是公司工作,但我确实参与了一些开放源代码项目和封闭源代码项目。
Madara Uchiha 2013年

@James:“更大的安全问题” ---怎么样?签名是解决问题的一种技术方法,不是吗?
zerkms 2013年

8
mikegerwitz.com/papers/git-horror-story.html是签名提交和标记用例的起点。

1
@James使用SVN帐户提交时,请签署提交。当您使用git global config提交时,您是确认您是作者的唯一权限。
Florian Margaine 2013年

Answers:


102

(这主要是基于《 Git恐怖故事:带签名的存储库完整性》 —很好的阅读,而且还有比我能回答的更多的信息。)

可以通过多种方式破坏git存储库(这不是安全缺陷,只是生活中的事实-因此不应避免使用git)。例如,某人可能已将您声称是您推送到您的存储库。或就此而言,某人可能已推送到声称自己是您的其他人的存储库中(某人可能已推送到声称自己也是您的自己的存储库中)。这只是DVCS生活的一部分。

举个例子:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email muchiha@example.com

在那里,我更改了git的配置以假装我是你。现在我可以提交,让那些提交以某种方式进入生产构建,看起来您已经完成了。

通过对提交(和标签)进行签名,可以证明某些提交和标签来自您(未签名的内容不应该进入生产版本)。这实际上就是全部的关键-通过签署提交,您已经说过这是您的工作。

“工作”方面在偶尔受到版权诉讼打击的linux内核(以及git)中尤其重要。通过签署承诺,您表示您拥有该软件的权利-它会跟踪源。可能是您无权访问被声明为版权的来源,并且该声明是毫无根据的。可能是该公司忘记了您几年前为他们工作,并且在他们的指导下为内核增加了材料,或诸如此类。

关于是否应该签署每个提交有一些争论。从GPG签署git commit?(早在09年),莱纳斯写道:

签署每个提交完全是愚蠢的。这仅意味着您将其自动化,并且使签名价值降低。它也没有增加任何实际价值,因为SHA1的git DAG链的工作方式,您只需要一个签名就可以使该提交有效地覆盖所有提交。因此,对每个提交进行签名只是遗漏了要点。

关于git登录的更多想法也可以在这里阅读。

也就是说,无论如何它都进入了git。

似乎已经达成共识,即不需要签署提交,但是签署标签非常好。顶部链接的博客文章表明,无论如何都应签名。如我所说,关于每次提交是否必要都存在一些争论。

“签署每次提交”辩论的关键可能与您使用的工作流程有关。大多数人在其本地存储库中进行大量提交,然后推送该组。标记最终集合就足够了(假设,即,确保所有更改都是正确的)。如果您在许多单个提交都在移动的环境中工作,则标记和提交之间的区别会变得越来越少……明显-签署提交可能会变得更加有用。


5
这可能就足够了(仅标记最后一个标记),但是为什么标记每个提交呢?
hayd '16

3
作为一个不使用标签的懒散杂种,我反对前面的评论。在我的工作站上的git config中,我commit.gpgsign = true可以确定没有缺点。虽然这可能很愚蠢,但似乎并不太昂贵。
pnovotnak

3
我要在这个上使用@pnovotnak,为什么不这样做呢?我的意思是我签署了自己的提交,而另一个开发人员不在同一个项目中,谁在乎呢?但是,如果黑客试图窃取我的身份,我可以指出签名。在我看来,签名仅具有优势。我确实同意您的签名获得的价值较低,但是您无需考虑就可以进行交易。它基本上是免费的安全性。
Jappie Kerk,

2
我个人认为签署每个承诺都是一件好事。我可以肯定的是,带有我的签名的内容来自我,而用香草git冒充作者是微不足道的。我宁愿将其称为免费验证,否则就是您认为的那个人,而不是安全性。
berto

1
@JosiahYoder。不,Github不会拒绝推送,因为电子邮件不在他们的服务中。假设您将代码托管在另一个服务(即Bitbucket)上,并且想将存储库移至另一个提供程序。它将阻止用户转移存储库(多个用户进行多次提交)或创建镜像等。这是DVCS的功能。
Ricky Notaro-Garcia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.