asjdf

一只在杭电摸鱼的小火鸡

记得给你的 commit 签名
Jul 29, 2022
One minute read

今天在倒腾 dn42,得给自己生一个 GPG key,顺便来谈谈如何给自己的 commit 签名。毕竟 Git 作为一个信任用户的系统,Git commit 信息的中的 author 是一个可以零成本造假的字符串。

注意!本教程仅供Windows用户,Linux对于软件安装和配置极为友好。

如何伪造?

首先,我们来看看一个 commit 里面包含哪些信息。

我们可以用 git log(或 Oh My Zsh 的 alias 命令:glog 来打印一个更为清楚的 commit 历史)来查看本地 Git 仓库的 commit 记录,并找到一个特定 commit 的 hash。例:a4256b5c

可以用 git cat-file -p a4256b5c 来查看这一 commit 的具体信息。

可以看到,每个 commit 都拥有 commit 的 author 和 commit 的 committer,分别是 commit 的第一作者和执行 commit 具体操作的人。 Git 仅记录了 commit author 和 committer 二人的名称、邮箱和时间戳,而其中的名称和邮箱正是我们配置 Git 时设定的 user.name 和 user.email,而 GitHub 也正是通过这两个仅有的字段确定 commit 的具体作者和 GitHub 身份的。

你可以手动修改本地的 user.name 和 user.email 信息来欺骗 Github,这里就不展开说了,当然有人把这个特性利用起来做了一个 git-blame-someone-else 如果你有兴趣的话可以进一步了解(实际上就是个巧妙的小 shell)。

如何签名?

下面进入正题

流程非常的简单,当然,我默认您对 git 等相关软件有一定的了解。

在此安利 scoop,绝对不会后悔安装它。我 Windows 系统中大量的开发工具都是用 scoop 在管理,省去了我大量搜索、安装、调试的时间。(在此感谢给 scoop 贡献代码和各种安装脚本的大佬)

默认您已经安装 scoop,然后我们执行:

scoop install gpg

然后我们就可以开始生成密钥对了,执行:

gpg --full-generate-key
  • 在密钥种类处:指定要生成的密钥类型,或按 Enter 键接受默认值。
  • 在密钥长度选项处:指定想要的密钥大小,或按 Enter 键接受默认值。 密钥必须至少是 4096 位。
  • 在密钥过期时间处:输入密钥的有效时长。 按 Enter 键将指定默认选择,表示该密钥不会过期。除非需要到期日期,否则建议您接受此默认值。
  • 验证您的选择是否正确。y 并回车
  • 在我们的用户 ID 和 GPG key 签名邮箱处:填写我们的常用用户名,并填入 GitHub 上面认证过的邮箱;
  • 最后,为密钥设置一个安全的密码,并一定记住这一密码。

我自己一路回车然后填了个 y 之后就开始填信息了。

这样,我们就生成了我们的第一对 GPG 密钥!我们可以用如下命令查看当前我们拥有的所有 GPG key:

gpg -k

其中,sec 一行的 ed25519或rsa等加密算法后的(或下方一行长的一批毫无规律的字符串就是我们的 GPG 私钥,假设其中的 RY1GDQBN67WOEY83 即为我们的 GPG 私钥 ID。

带上私钥我们就可以告诉本地的 Git 以后该如何给我们的 commit 签名了。

git config --global user.signingkey RY1GDQBN67WOEY83
git config --global commit.gpgsign true

最后,告诉 GitHub 我们的公钥即可

拿着刚刚我们拿到的私钥 ID:RY1GDQBN67WOEY83,我们使用下面的命令即可导出我们的 GPG 公钥:

gpg --armor --export B2FE8EC526F58285

将输出粘贴进入 GitHub 的 Settings » SSH and GPG keys » New GPG key,并保存。

结束!下班!


我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=dwle72s7pal5


Back to posts