[英]What data is being signed when you `git commit --gpg-sign=<key-id>`?
[英]When using GPG to sign git commits, what exactly is being signed?
如果我使用 GPG 签署提交( https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work )然后检查我刚刚创建的提交 object 的内容:
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 中,那么它几乎不可能是提交 hash 本身 - 那么它是树 hash 吗? 或者是其他东西? 这是否反过来意味着提交消息没有签名并且可能被篡改?
Note: I'm using a git repository here that was initialized with --object-type sha256 to use SHA-256 based hashes (by default git uses SHA-1), but my question applies to git repositories with SHA-1 hashes as好吧(如果 gpg 签名对 SHA-1 和 SHA-256 存储库的工作方式不同)
您要签名的数据是提交或标记 object 的全部内容,减去以gpgsig
开头的任何多行标头的内容,以及在标记的情况下,尾随标记签名的内容。 因此,基本上 object 的内容减去签名部分本身。 这包括消息。
请注意,object 的 hash包含签名,因此除非您重写历史记录,否则无法删除或更改(或添加其他签名)签名。
Git 2.30 及之前的版本有一个错误,他们会错误地将具有多个签名的提交或标记标记为无效。 下一个版本中可能会包含一个补丁来解决这个问题。
如果您将没有签名部分的提交放入名为commit
的文件中,并将签名部分(减去前导空格)放入名为commit.asc
的文件中,则可以使用gpg --verify commit.asc
验证签名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.