提交签名如何工作?

How does commit signing work?

我目前想知道 git 提交签名究竟是如何工作的。

试图找出这一点,但找不到任何确切的技术文档。我知道如何进行 git 提交签名,但我想知道 git 究竟做了什么来签署提交。

签名的到底是什么?它是给定提交时存储库中的完整数据,还是提交消息等数据以及所有文件的数据?或者它只是带有指向所包含文件等的指针的提交?

虽然在任何地方都没有记录,但对 source code 的检查表明它是提交对象的全部内容。这些内容然后被修改为 insert 签名,因此验证过程必须将签名剥离到一个单独的缓冲区中,并将原始的预签名插入数据传递给 GPG 签名者.

然后,GPG 签名数据用于计算提交的 SHA-1 校验和,以成为提交的哈希 ID。参见 gpg-interface.ccommit.c,函数分别为 sign_bufferdo_sign_commit。标记签名在 builtin/tag.c 中(参见函数 do_sign 及其调用者);已签名标签的签名是附加的而不是插入的,但除此之外的工作方式几乎相同。

它是 git cat-file 返回的原始提交对象(已删除签名)已签名。如果 HEAD 是一个签名的提交,你可以手动验证签名如下:

git cat-file commit HEAD > signed-commit
grep -B 9999 'BEGIN PGP SIGNATURE-----' signed-commit | head -n -1 > signed-commit.stripped
grep -A 9999 'END PGP SIGNATURE-----' signed-commit | tail -n +2 >> signed-commit.stripped
sed 's/^gpgsig //' signed-commit | sed 's/^ //' > signed-commit.sig
gpg --verify signed-commit.sig signed-commit.stripped