2016-02-22 99 views
1

在github上使用來自未知第三方的代碼時,我總是確保檢查沒有明顯的可能危及系統安全的後門程序的代碼。是一個git commit hash可信嗎?

我正在審查的存儲庫的特定狀態可能會綁定到git標記和提交哈希。 我們知道,git標籤的內容可以很容易地改變。所以再次下載源代碼並基於版本標籤信任它絕對不安全。

我的問題是:當重新下載源代碼時,我可以相信,如果我簽出基於完全提交哈希的特定提交,那麼這與我之前評論的代碼完全相同?

這個問題的焦點並不在於發生sha1碰撞的概率(因爲碰撞比計算特定的sha1哈希更容易計算 - 希望 - 現在幾乎不可能?),但是每個文件是否是這個sha1總和的一部分,這樣一個變化總會引發一個不同的散列。

回答

5

總之:是的。

this page你可以看到這個sha1總和是如何形成的。它是由:

  • 的源樹提交(它揭開所有子樹和 斑點
  • 父提交SHA1
  • 作者信息
  • 的提交者信息(沒錯,這些都是不同的!)
  • 的提交信息

所以前夕每個文件中的變化都包含在sha1sum的計算中。 AFAIK你可以相信,對任何文件的任何更改都會給出不同的sha1總和。

編輯:我開始通過我提交的一個工作:

git cat-file commit HEAD 

給出:

tree 563ccb5109fbf0a01d99517ca1dbe15db349592d 
parent 3c6f0800708aeaaeaba804273406ddcd0b3175ad 
... 

現在git cat-file -p 563ccb5109fbf0a01d99517ca1dbe15db349592d

100644 blob d8fe4fa70f618843e9ab2df67167b49565c71f25 .gitignore 
100644 blob dba1ba3a31837debf7a28eceb194e86916b88cbc README 
040000 tree 37ad71e959c6dadd0e4b7aff8a0c6e85a0eff789 conf 
040000 tree 60eca667ab8b5852ecd2dd2d91d198a3956a8b73 etc 
040000 tree 634c4c2ec34aec14142b5991bd3a5126110f2cae sbin 
040000 tree 256db03954535d25d5f340603e707207170f199c spec 
040000 tree 9e1e156f88b842da471f52d4c135f391319b4991 usr 

,我可以繼續更深:git cat-file -p d8fe4fa70f618843e9ab2df67167b49565c71f25

/.project 

(這是我的.gitignore文件的內容)或git cat-file -p 256db03954535d25d5f340603e707207170f199c

100644 blob 591367a913adbeb1c86d674d240fb08ab8ccf78b base.spec 

(這是我的 「規格」 目錄的內容)。

因此,您可以看到,每個文件的內容遞歸呈現在文件的sha1總和中;然後在sha1和源樹中,最後在sha1之和提交

+0

謝謝!你能舉一個例子,說明如何從文件內容中使用'git cat-file -p'生成(文件)哈希值?它們似乎不是該文件的「sha1sum」。 – Zulakis

+0

'git hash-object ' –

+0

@ChrisMartin的評論者:正如你所說的,你不想解決碰撞的可能性,就我而言,答案是YES。正如ChrisMartin指出的那樣;這種可能性仍然存在,所以沒有堅實的**保證**,即永遠不會發生碰撞。 –

0

Git散列一切,所以對你的標題和底線問題:是的。


碰撞是一個容易得多計算比計算特定的SHA1哈希 - 這是 - 希望 - 幾乎是不可能的時刻?

兩個計數都正確。你甚至可能會丟失「非常多」的部分,「有可能構造一個具有給定SHA1哈希代碼的消息」的答案正確地是「哈哈,不」。