前面在講要查詢 commit 時要看他的 SHA-1 碼,這個 SHA-1 到底是什麼!今天就來補充不知道也不會死的冷知識吧!!
SHA-1 的全名是 Secure Hash Algorithm 1,中文翻譯就是「安全雜湊演算法 1」,他是一種密碼雜湊演算法,透過演算產生 40 個十六進位的數字,下圖為 SHA-1 壓縮演算法中的一個迴圈。
A, B, C, D和E是這個state中的32位元文字;F是會變化的非線性函式;<<<n代表bit向左循環移動n個位置。n因操作而異。田代表modulo 232之下的加法,Kt是一個常數。
SHA-1 的特性就是輸入一樣的值,就會產生一樣的輸出值,所以 git 都是使用這個演算法來產生編碼的。
而 git 是使用「內容」來進行版本控制的,所以 SHA-1 看的並不是檔案名稱,而是他的內容。
那這個編碼會不會有重複的問題?
上述有說過,SHA-1 是根據輸入內容來決定,當輸入的內容一樣時就會產生一樣的輸出值,所以當 SHA-1 一樣時,代表的是內容是一樣的。
那如果,真的是兩個內容不一樣的檔案卻產生相同的 SHA-1 呢?這個情況稱之為碰撞(collision),但這個情況發生的機率真的很小很小很小...
但又有另一個情況發生了!就是 Google 在 2017 年成功破解 SHA-1 碼,就有很多人擔心十分依賴 SHA-1 的 git 會不會因此被駭入,但 git 創始人 Linus Torvalds 回覆說「git 除了使用 hash 產生 SHA-1 外,還會紀錄數據長度等資訊,因此破解上還是有一定難度」,而一樣是使用 git 進行控管的 GitHub 則是表示「將增加 SHA-1 加密碰撞的自動偵測和預防的功能,避免所有代管專案發生檔案雜湊值重複的情況。」以及「日後所有Github上任何SHA-1運算,都會進行檢測,只要發現會產生碰撞,就會自動中止,來防止攻擊者使用GitHub做為碰撞攻擊的平臺。」
以上就是關於 SHA-1 的一些小故事,可以更加理解 git 存取內容的方式,關於更多 git 的內部原理可以參考這篇文章。