为啥Github允许冒充别人的身份Commit( 二 )


那么Git就没办法杜绝这种伪造行为了吗?还是有的,那就是GPG签名。这里就只简单说下。用户可以生成一对GPG密钥,公钥可以发布出去让其他用户获取到,私钥自己保管好不要泄露出去(和ssh密钥类似)。生成commit的时候,可以用参数-S(大写的)或者--gpg-sign来对commit进行签名。签名以后的commit其他人还是可以重写伪造,但是重写伪造以后的commit是无法通过校验的,也就暴露了是赝品。记得之前看过Linus把他的公钥文件也推送到了kernel仓里,并且创建了一个tag指向了这个公钥,不过这一点我不是很确定了。克隆kernel仓库的用户如果有需要,可以用这个tag指向的公钥来校验某个看起来是Linus签过名的commit是否是原味的。另一个我确定的例子是https://github.com/git/git.git仓库里名为junio-gpg-pub这个tag。用命令git show junio-gpg-pub可以看到这个tag的内容,作者是Junio C Hamano(滨野纯)。在这个tag里他介绍了这个tag的作用和内容。
上面提到了tag,git有两种tag,一种是轻量级的,像分支那样的一个引用;另一种是带注释的,和commit有点相似,也会以object的形式存在。带注释的tag包含了tagger信息,也可以伪造身份,因此对这类tag也可以进行GPG签名。
即便是这样,如果GPG私钥泄露了,那么别人还是可以伪造身份。当然,这种可能性非常小了。

■网友
所以我们需要用 GPG 签名来钦定下:
为啥Github允许冒充别人的身份Commit

是不是瞬间有了「尊贵的 GitHub 开发者」的 feeling 了?
参见:GitHub Help - Managing commit signature verification
--

■网友
不是说GitHub允许,是git本身的机制决定的,git的commit是以邮箱为标志的。解决方案是用GitHub提供的额外密码认证。
■网友
【为啥Github允许冒充别人的身份Commit】 committer 是个可零成本假造的字符串。如果有人信了这个导致问题,那么此人是安全漏洞。


推荐阅读