1 前言#
GPG(GNU Privacy Guard)是 GNU 项目的一部分,是一个用于加密、解密、签名和验证数字签名的非对称加密开源工具。它是 PGP(Pretty Good Privacy)协议的免费实现,广泛应用于文件加密、邮件加密、代码签名等领域,旨在提供数据安全性。
2 为什么需要 GPG 签名#
在 Git 提交 commit 之前,Git 会要求我们设定好 username 和 email。然而,如果不设置成自己的 username 和 email,GitHub 等代码托管平台不会将这些 commit 算在你头上,而是算在了你伪造的用户头上。这意味着,任何人只要知道邮箱,就可以用他人的名义提交 commit,而邮箱在互联网上是可以轻易获取的信息。
试想一下,当你使用某个业内广泛认可的开源库时,获取到的版本可能是由某个黑客伪装成原开发者并进行修改后的版本。黑客可以在代码中加入破坏性的代码,而如果你没有仔细查看源码,且对原开发者的代码不熟悉,是很难发现问题的。如果这个开源库涉及到金融领域,造成的损失将是不可估量的。据不可靠消息称,曾有人使用了被篡改后的比特币钱包,导致损失了大量的比特币。
因此,为了确保代码的可信度,确保提交的代码确实是由作者本人提交的,GitHub 等主流代码托管平台纷纷支持了 GPG 签名,并且只信任由作者本人在设置中配置的 GPG 公钥。由于 GPG 公钥和私钥是通过非对称加密生成的,理论上不存在被伪造或反编码的风险。
3 使用 GPG 签名#
3.1 安装 GPG#
在不同的平台上,GPG 都可以通过包管理器轻松安装。以下是一些常见的安装命令:
# MacOS
brew install gpg
# Debian, Ubuntu
sudo apt-get install gnupg
安装完成后,可以使用以下命令查看 GPG 的版本:
gpg --version
3.2 生成 GPG 密钥对#
要使用 GPG,首先需要生成 GPG 密钥对。使用以下命令生成密钥对:
gpg --full-generate-key
在生成密钥对的过程中,系统会提示选择密钥类型、密钥长度、有效期等选项。接着,输入个人信息,并设置私钥的密码。至此,GPG 密钥对便成功生成了。
使用以下命令查看当前系统中的密钥对:
gpg --list-keys
3.3 配置公钥#
生成密钥对后,需要将公钥配置到代码托管平台上。以下以 GitHub 为例,介绍如何配置公钥。
首先,使用以下命令从生成的密钥对中导出公钥:
gpg --export --armor <GPG_KEY_ID>
然后,访问 GitHub 的 GPG 密钥设置页面( https://github.com/settings/gpg/new),将导出的公钥粘贴到输入框中并保存。
3.4 配置 Git 使用 GPG 签名#
现在,可以将 GPG 密钥与 Git 关联,以便对提交进行签名。使用以下命令将 GPG 密钥与 Git 关联:
git config --global user.signingkey <GPG_KEY_ID>
接着,配置 Git 全局启用 GPG 签名:
git config --global commit.gpgsign true
如果只想在某个特定的仓库中启用签名,可以去掉 --global
选项,并在该仓库的目录下运行以下命令:
git config commit.gpgsign true
配置完成后,每次创建 commit 时,Git 都会自动使用 GPG 密钥对提交进行签名。当然,如果不想默认启用签名,也可以在每次提交时手动签名:
git commit -S -m "Your commit message"
-S
选项表示对提交进行签名。
3.5 验证签名#
可以使用以下命令查看提交是否已签名,并验证签名的有效性:
git log --show-signature
以下是一个已签名的提交和一个未签名的提交的示例:
推送提交到 GitHub 后,GitHub 也会验证签名,并在提交历史中显示对应的标识。
提示:由于终端窗口加载的问题,可能会出现无法弹出 GPG 私钥密码输入框的情况。可以使用以下命令来解决这个问题,确保 GPG 使用的终端与当前终端一致:
export GPG_TTY=$(tty)