我目前想知道git commit签名是如何正常工作的。
试图找到这个,但找不到任何确切的技术文档。我知道如何进行git commit签名,但我想知道git在签名提交时究竟做了什么。
签到了什么?它是给定提交中存储库内的完整数据,所以提交消息等数据和所有文件的数据?或者只是提交指向包含文件的指针等?
答案 0 :(得分:5)
尽管在任何地方都没有记录,但source code的检查表明它是提交对象的全部内容。然后将这些内容修改为 insert 签名,以便验证过程必须将签名剥离到单独的缓冲区中,并将原始的签名前插入数据传递给GPG签名者。
然后,在计算SHA-1校验和以使提交成为提交的哈希ID时,发生GPG签名数据。分别参见gpg-interface.c
和commit.c
,函数sign_buffer
和do_sign_commit
。标记签名位于builtin/tag.c
中(请参阅函数do_sign
及其调用者);签名的标签附加了签名而不是插入,但是其他方式的工作方式大致相同。
答案 1 :(得分:0)
它是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