当使用GPG签署git提交时,究竟签署了什么内容?

3

如果我使用GPG签署提交(https://git-scm.com/book/zh/v2/Git-工具-签署你的工作),然后检查我刚创建的提交对象的内容:

git commit -a -S -m "This is a Signed commit"
git cat-file -p HEAD

我收到:

tree 1265193cc831c2bd47cedbb27f029e5d45fa0bb039d5bb5136f152a3e88c07b0
parent 16625976433ec56a26feb1478051b28b78684a3d68f475221afcfae2a7aaaa0d
author John Doe <john.doe@internet.www> 1612379624 +0100
committer John Doe <john.doe@internet.www> 1612379624 +0100
gpgsig-sha256 -----BEGIN PGP SIGNATURE-----

 iQGzBAABCAAdFiEELgGt+L8yg4keIDJDpyYj1XHdLa8FAmAa9egACgkQpyYj1XHd
 La+BogwA0VEoobCJPRLk2olHzW6iO9ioyxIrrW6uPAcLv6uernxrGDK6odYuywED
 XeVEu3L9/HLG8MYSqgAGKDWfiOphRi5Lw1fLnSA3MNC1uh18OqdmD/PjyP9hMnbC
 XayugJJ2dPkUHADxeDoQOGHg6wmfn+/4IsHit74YsAYXcDz1/QIHrEGMPCwROGCX
 Nb1srMw2/8e+NM9U5h5KSw5ZYmBtSynIWCsHBC2w8eqvuhKMmKxbGV3izV7eOTfl
 R8aC2FJSuSd/MhGprAki2sW1efiNr1EJNt/hvP2S9Eq/fkLUlVuWk5cyg/8tDJX5
 VQO5RqCTR/Yz5mleoKMOeBBARzWK/r1l0bVQZYoraO8I8zxuLt5gkxqvqTOrhOKy
 uTX58BdQHSlx1fU02UuPruimpbSZOBhwPFeVXl8Kj3zUWLNpTeQXZ/MSNZOiR1qF
 xMdqKbuzh53B3tqvd02Cy7jdIssT8DwLM5V3IjYfv/GG/iQOE7BHGxYbPgEkv4e6
 KvUBxEjj
 =8gBZ
 -----END PGP SIGNATURE-----

This is a Signed commit

具体要签名的摘要是什么?如果签名嵌入到提交对象中,那么它几乎不可能是提交哈希本身——因此它是树哈希吗?还是其他东西?

这是否意味着提交消息未被签名,可能会被篡改?

注意:我在这里使用了一个通过--object-type sha256初始化以使用基于SHA-256的哈希的git存储库(默认情况下,git使用SHA-1),但是对于使用SHA-1哈希的git存储库也适用我的问题(如果gpg签名对于SHA-1和SHA-256存储库的工作方式不同)。


4
当我为 Git 提交签名时,我的签名实际上是基于什么的? - user14215102
1
这比你所表现的要容易得多。摘要是基本提交的哈希值。生成的提交哈希值是基本提交加签名的结果。 - jthill
@jthill 那么如果我想手动验证签名,该如何恢复原始摘要?是在标题和提交消息之间删除签名,然后计算结果的SHA-1(或SHA-256)吗? - matthias_buehlmann
1
试一下,看看。 - jthill
1个回答

3
你需要签名的数据是提交或标签对象的全部内容,减去任何以开头的多行标题的内容,以及在标签情况下结尾标签签名的内容。因此,基本上是对象的内容减去签名部分本身。这包括消息。
请注意,对象的哈希包括签名,因此除非你重写历史记录,否则无法删除或更改签名(或添加其他签名)。
Git 2.30及之前版本存在一个错误,会错误地将具有多个签名的提交或标签标记为无效。有一个补丁可能会在下一个版本中包含以修复该问题。
如果您将不包含签名部分的提交放入名为的文件中,并将签名部分(减去前导空格)放入名为的文件中,则可以使用验证签名。

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