雜湊(hash)也是密碼學重要的討論主題。在簡介密碼學時,有簡單講過雜湊的特性,今天聊一下這個主題。
雜湊比較廣為人知的實作如下:
因 MD5 已被認定為不安全的演算法,而不安全主要是因為它無法防止碰撞(collision)。相較 SHA 是比較安全的演算法,只是舊版的也有被攻破的記錄,兩個演算法的歷史如下:
雜湊的應用其實就在身邊,了解實際會如何使用,更能了解雜湊的這些特性對安全有什麼幫助。
對開發者來說,這應該是最常見的應用了。
使用 git show
指令會顯示如下面的 commit 內容
commit f3a98188d57b18b6c829e58e67fecad51b23e972
Author: MilesChou <jangconan@gmail.com>
Date: Wed Sep 25 00:58:59 2019 +0800
其中,有個像是身分證一樣的亂碼如下面的 f3a9818...
,這個正是使用 commit 內容經過 SHA-1 演算法後產生出來的。會這麼做的主要原因有兩個:一個是為了產生唯一的 ID,另一個則是要 commit 不同的程式,但產生出一模一樣的 hash 來達成造假,是非常不容易的。
由此可以了解,Git 活用了碰撞抵抗的特性來保護原始碼的完整性。
如同 Git,區塊鏈也是應用了雜湊來確保完整性:
每一個區段包含了前一個區段的加密雜湊、相應時間戳記以及交易資料,這樣的設計使得區段內容具有難以篡改的特性。
也有其他的應用,如比特幣是使用 SHA-256 來產生位址的,而從位址也無法反推原始的個人資料為何;以太坊則是用另一個演算法 Ethash 來產生雜湊。
比方說 Debian 的下載目錄裡,除了要讓大家使用的 ISO 檔以外,還會附帶 一個 xxxSUMS
的檔案,如 MD5SUMS
的內容如下:
b931ef8736c98704bcf519160b50fd83 debian-10.1.0-amd64-netinst.iso
51c6ae8cfb093c9f74deae8034619329 debian-10.1.0-amd64-xfce-CD-1.iso
691461a1838f2bfce0276f8db1e8c106 debian-edu-10.1.0-amd64-netinst.iso
884cb50ef98417fd3cf7c44d12c51dc5 debian-mac-10.1.0-amd64-netinst.iso
以第一行的內容來舉例,它代表對下載回來的 debian-10.1.0-amd64-netinst.iso
檔案做 MD5 運算的話,會得到 b931ef8736c98704bcf519160b50fd83
的結果。因雜湊只要內容有變,產生出來的結果就會大為不同,若下載過程有掉封包,或是下載過程被中間人攻擊插入惡意的檔案,都會在檢查雜湊結果的時候發現,這能有效確保完整性。
在 Google 搜尋「密碼外洩」會發現非常多這樣的事件。雖然大家在設計服務的時候,都會把資料庫放在最安全的地方,但「道高一尺,魔高一丈」,功力高強的駭客還是有機會鑽漏洞進到服務裡面偷資料。如果資料庫裡面的會員密碼是用明文保存的話,那這將會成為下一個密碼外洩事件。
以密碼這個資料來說,相較安全的做法是把密碼做雜湊後,再放到資料庫裡。因雜湊具有 preimage resistance 的特性,即便資料庫被偷走,攻擊者也難以從雜湊回推原始輸入,如此一來,會員資料的安全性就提升了不少。
如果有高度安全需求的話,目前 SHA-2 與 SHA-3 是建議採用的演算法。其他演算法如 MD5 雖然安全性不足,但效能與通用性(如語言直接內建或指令內建)依然不輸 SHA 家族,因此單純檢查下載檔案的完整性,使用 MD5 還是非常方便的。
https://news.ycombinator.com/item?id=17820961
請問一下,這篇討論說的 SHA-256 跟現在 Git 用的 SHA-1 差在哪裡?
可以把 SHA-1 當作是第一代,SHA-2 則包含了多種演算法,包含連結裡面有提到的 SHA-256 / SHA-512 等,算是第二代的演算法;當然 SHA-3 就是第三代了。
原來如此