Asjdf

一只在杭电摸鱼的小火鸡

记得给你的 commit 签名

2022-07-29 大约1207字 预计阅读3分钟

今天在倒腾 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

闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme