iT邦幫忙

2021 iThome 鐵人賽

DAY 25
3
Modern Web

曼曼來比較快_Git 版本控制系列 第 25

【Day25】Git 版本控制 - SHA-1 是什麼

  • 分享至 

  • xImage
  •  

前面在講要查詢 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 的內部原理可以參考這篇文章

Reference

SHA-1 wiki
Git 內部原理


上一篇
【Day24】Git 版本控制 - 修改 commit 紀錄:amend
下一篇
【Day26】Git 版本控制 - merge 發生衝突
系列文
曼曼來比較快_Git 版本控制30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言