提交签名是如何工作的?

12

我目前在想Git提交签名的工作原理。

尝试查找,但未找到确切的技术文档。我知道如何进行Git提交签名,但是我想知道Git签名提交时具体做了什么。

到底签了什么?它是对给定提交时库中的全部数据进行签名,例如提交消息等数据和所有文件的数据吗?还是只对指向包含文件的提交进行签名等指针?


你是在询问签名标签吗? - Leon
https://help.github.com/articles/signing-commits-with-gpg/ - Matt Schuchard
@Leon:我非常确定他想知道GPG接收了什么数据。最近的演示中,有意制造了SHA-1碰撞,这使得问题更加有趣。 - torek
2个回答

9
尽管没有任何文档记录,但检查源代码表明它是提交对象的全部内容。这些内容会被修改以插入签名,因此验证过程必须将签名剥离到单独的缓冲区并将原始的、未经签名插入处理的数据传递给GPG签名者。
然后,在计算SHA-1校验和以成为提交的哈希ID时,进行GPG签名数据处理。请参见gpg-interface.ccommit.c,分别是函数sign_bufferdo_sign_commit。标记签名在builtin/tag.c中(参见函数do_sign及其调用程序)。已签名标签附加了其签名,而不是插入,但除此之外,这种方式基本相同。

你的猜测是正确的,它是受 SHA-1 演示启发而提出的 ;) 只是为了确保我正确理解了代码(我更擅长 Java 而不是 C)。只有包含对树的 SHA-1 引用的提交对象才会被签名。因此,如果我有一个已签名的提交,我不能确定树是正确的,只能确定签名者为具有相同哈希值的树创建了提交?这真的很遗憾... - Markus Kreusch
1
@MarkusKreusch:是的,签名直接保护的仅是提交或标签对象的内容。然而,提交和标签对象有一个相当明显的形式(尽管允许包含任意文本),而现有的打败SHA-1的技术留下了一个明显的痕迹。树状对象的形式甚至更加受限:Git可以(并且应该已经)轻松检测到格式不正确的树形结构。只有blob对象才真正容易受到第二像攻击。话虽如此,如果Git能够开始使用SHA-256,那将非常好,但过渡会非常艰难。 - torek
请参阅 https://dev59.com/MFgQ5IYBdhLWcg3wo1lE 和其中的邮件列表链接。这是与编程有关的内容。 - torek
感谢提供链接。现已仔细阅读论文,并得出结论:以这种形式将无法使用它来为存储在Git存储库中的现有“好”对象创建冲突。但是,仍然很希望看到Git使用SHA-256。 - Markus Kreusch
Linus关于git和sha1的声明:https://plus.google.com/+LinusTorvalds/posts/7tp2gYWQugL - Markus Kreusch

6

被签名的是由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 

这个注释清晰地展示了如何在不使用git命令的情况下评估签名提交。在这里添加一个样例:https://gist.github.com/stackdump/846c1358f9b8576173f95216abb04c88 - stackdump

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接