使用GPG防止commiter冒充
摘要: 本文介绍了通过GPG密钥对实现对Git提交的签名验证,以防止commiter被冒充。作者详细说明了生成、导出和配置GPG密钥的步骤,并演示了在Git和GitHub中使用GPG签名提交的方法。通过GPG签名,平台可以在PR和提交记录中显示verify标签,从而验证提交者的身份,增强代码安全性。作者强调,GPG签名依赖私钥的安全,能有效防止恶意冒充,但若账户被攻破,安全措施也难以保障。 (评价: A)
Github/Gitlab等平台上,有添加GPG keys的选项,GPG keys有什么用呢?
如题,使用GPG认证可以防止commiter冒充。
如何生成和管理GPG密钥对的详细过程可以参考阮一峰的《GPG入门教程》。
我们来简化过程(学会多用help和man)。
使用GPG
首先,生成一组密钥对:
|
|
默认会使用RSA加密算法,根据提示输入需要的信息即可,比如姓名、邮箱。
然后查看生成的密钥对:
|
|
得到类似以下信息:
|
|
其中DD723C3FC1B7322FEB3FD431C3238EDE9A24AC28
是我们需要用到的一段key,只是一段摘要信息,即使暴露也是安全的。
现在,需要导出该密钥对的public key:
|
|
将得到如下类似的串:
|
|
复制上述段全部,接下来以Github举例。在Github GPG keys中导入该public key。在git配置中,先配置好默认的GPG签名密钥对:
|
|
在作为修改后,尝试带上签名提交,如下(这样提交不是好的写法,仅做简写):
|
|
(如果在生成GPG key的时候,输入了密码,那么在上述命令执行后是需要输入密码的。)
通过git log
可以得到以下类似的提交信息,然后push到仓库:
|
|
提交后,就可以在Github的commits处看到有如下记录:
如果不进行签名,那么就不会携带verify认证:
GPG防止commiter冒充
那么,GPG是如何防止commiter冒充的?在Github等平台上,可以通过上述verify标签判断是否真正的commiter。在PR阶段,仓库管理员就可以通过verify标签验证,来确定是否merge。(或者CI自动化判断也可以)
commiter如何被冒充?
因为git配置的时候,邮箱和用户名是可以随意修改,当其他人对你的仓库有提交权限的时候(比如一个开源仓库的开发人员),他就可以通过修改用户名、邮箱信息来冒充commiter。
这时候可能有些“不法分子”就会通过冒充commiter来博取信任,从而提交一些违规代码,或者扰乱项目正常进行。
通过GPG秘钥签名,保证物理安全,只要GPG私钥不泄露,那么一方面就可以保证代码是从真正commiter的设备上提交的;另一方面,通过设置签名密码,也可以加强commiter认证,降低被冒充的风险。
攻击者不是可以通过把他的GPG公钥放到Github GPG keys列表中来冒充吗? →_→ 他都能破解你的Github账户了,那也没什么好防御的了~