我目前想知道如何git提交簽名完全正常工作。提交簽名如何工作?
試圖找出這個,但找不到任何確切的技術文檔。我知道如何做git提交簽名,但我想知道git簽署提交的確實做了什麼。
究竟是什麼被簽名?在給定的提交中,它是否是存儲庫中的完整數據,所以像提交消息等數據以及所有文件的數據?或者它只是提交指向包含文件等的提交?
我目前想知道如何git提交簽名完全正常工作。提交簽名如何工作?
試圖找出這個,但找不到任何確切的技術文檔。我知道如何做git提交簽名,但我想知道git簽署提交的確實做了什麼。
究竟是什麼被簽名?在給定的提交中,它是否是存儲庫中的完整數據,所以像提交消息等數據以及所有文件的數據?或者它只是提交指向包含文件等的提交?
雖然沒有記錄在任何地方,但對source code的檢查表明它是提交對象的全部內容。這些內容隨後被修改爲插入簽名,以便驗證過程必須將簽名去除到單獨的緩衝區中,並將原始的預簽名插入數據傳遞給GPG簽名者。
GPG簽名數據然後發生在計算SHA-1校驗和以提交成爲提交的哈希ID。分別參見gpg-interface.c
和commit.c
,功能sign_buffer
和do_sign_commit
。標記簽名位於builtin/tag.c
(請參閱功能do_sign
及其調用者);簽名標籤的簽名是附加的而不是插入的,但除此之外,其工作方式幾乎相同。
你的假設我被SHA-1演示的啓發是正確的;) 只是爲了確保我正確理解代碼(我更像是一個Java,而不是C人)。只有包含對樹的SHA-1引用的提交對象才被簽名。所以如果我有一個簽名的提交,我不能確定樹是否正確,但只有簽名者創建了一個具有相同散列的樹的提交?這真的很傷心...... –
@MarkusKreusch:是的,簽名*直接*只保護提交或標籤對象的內容。但是,提交和標記對象具有相當明顯的形式(儘管允許包含任意文本),並且用於擊敗SHA-1的現有技術留下了明顯的痕跡。樹對象具有更多的約束形式:Git可以(也應該已經)輕鬆檢測到格式不正的樹。只有斑點物體才真正受到第二原像攻擊。所有這一切說,如果Git可以開始使用SHA-256,那將是一件好事,但過渡將會非常粗糙。 – torek
(另請參閱http://stackoverflow.com/q/42433126/1256452及其中的郵件列表鏈接。) – torek
這是由git cat-file
(簽名已刪除)返回的原始提交對象。如果頭一個簽名提交,您可以按如下手工驗證簽名:
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
你是詢問[簽字標籤(https://git-scm.com/docs/git-tag#git-標籤 - S)? – Leon
https://help.github.com/articles/signing-commits-with-gpg/ –
@Leon:我很確定他想知道向GPG提供了哪些數據。最近的演示中,有意識的SHA-1碰撞被創建,這變得更加有趣。 – torek