我目前在想Git提交签名的工作原理。
尝试查找,但未找到确切的技术文档。我知道如何进行Git提交签名,但是我想知道Git签名提交时具体做了什么。
到底签了什么?它是对给定提交时库中的全部数据进行签名,例如提交消息等数据和所有文件的数据吗?还是只对指向包含文件的提交进行签名等指针?
我目前在想Git提交签名的工作原理。
尝试查找,但未找到确切的技术文档。我知道如何进行Git提交签名,但是我想知道Git签名提交时具体做了什么。
到底签了什么?它是对给定提交时库中的全部数据进行签名,例如提交消息等数据和所有文件的数据吗?还是只对指向包含文件的提交进行签名等指针?
gpg-interface.c
和commit.c
,分别是函数sign_buffer
和do_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