今天在倒腾 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,然后我们执行:
然后我们就可以开始生成密钥对了,执行:
- 在密钥种类处:指定要生成的密钥类型,或按 Enter 键接受默认值。
- 在密钥长度选项处:指定想要的密钥大小,或按 Enter 键接受默认值。 密钥必须至少是 4096 位。
- 在密钥过期时间处:输入密钥的有效时长。 按 Enter 键将指定默认选择,表示该密钥不会过期。除非需要到期日期,否则建议您接受此默认值。
- 验证您的选择是否正确。
y
并回车 - 在我们的用户 ID 和 GPG key 签名邮箱处:填写我们的常用用户名,并填入 GitHub 上面认证过的邮箱;
- 最后,为密钥设置一个安全的密码,并一定记住这一密码。
我自己一路回车然后填了个 y 之后就开始填信息了。
这样,我们就生成了我们的第一对 GPG 密钥!我们可以用如下命令查看当前我们拥有的所有 GPG key:
其中,sec 一行的 ed25519或rsa等加密算法后的(或下方一行长的一批毫无规律的字符串就是我们的 GPG 私钥,假设其中的 RY1GDQBN67WOEY83 即为我们的 GPG 私钥 ID。
带上私钥我们就可以告诉本地的 Git 以后该如何给我们的 commit 签名了。
最后,告诉 GitHub 我们的公钥即可
拿着刚刚我们拿到的私钥 ID:RY1GDQBN67WOEY83,我们使用下面的命令即可导出我们的 GPG 公钥:
将输出粘贴进入 GitHub 的 Settings » SSH and GPG keys » New GPG key,并保存。
结束!下班!
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=dwle72s7pal5