【发布时间】:2021-05-08 02:17:31
【问题描述】:
如果我使用 GPG 对提交 (https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work) 进行签名,然后检查我刚刚创建的提交对象的内容:
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 初始化的 git 存储库以使用基于 SHA-256 的哈希(默认情况下 git 使用 SHA-1),但我的问题适用于带有 SHA-的 git 存储库1 个哈希值(如果 gpg 签名对 SHA-1 和 SHA-256 存储库的工作方式不同)
【问题讨论】:
-
这真的比你想象的要容易得多。摘要是基本提交的哈希值。结果提交的哈希是基本提交加签名。
-
@jthill 如果我想手动验证签名,我将如何恢复原始摘要?去掉 header 和 commit message 之间的签名,然后计算结果的 SHA-1(或 SHA-256)?
-
试试看。
标签: git signature sha256 sha pgp