簡介雜湊

雜湊(hash)也是密碼學重要的討論主題。在簡介密碼學時,有簡單講過雜湊的特性,今天聊一下這個主題。

雜湊比較廣為人知的實作如下:

  • MD5(全名為 Message-Digest Algorithm),此演算法被定義在 RFC 1321
  • SHA(全名為 Secure Hash Algorithm),由 NSA(美國國家安全局) 所設計。

因 MD5 已被認定為不安全的演算法,而不安全主要是因為它無法防止碰撞(collision)。相較 SHA 是比較安全的演算法,只是舊版的也有被攻破的記錄,兩個演算法的歷史如下:

  • MD4:1990 年發布,但 1991 年馬上發現弱點,而在 2004 年證明會發生碰撞。
  • MD5:1992 年發布,目的是取代 MD4,但 1996 年發現弱點,一樣也是 2004 年證明會發生碰撞。
  • SHA-0:1993 年發布,但 NSA 馬上又撤回。
  • SHA-1:1995 年發布,並被廣泛應用到許多需要安全雜湊的協定上,如 TLS。但 2005 年發現了有效的攻擊方法,2017 年 Google 即宣布成功的 SHA-1 碰撞攻擊。
  • SHA-2:2001 年發布,底下又分為 6 種不同的演算法,如 SHA-256。目前還沒有有效的攻擊方法。
  • SHA-3:2015 年發布,雖然 SHA-2 還沒找到弱點,但還是得準備一個更安全可替換的雜湊方法,以防 SHA-2 又被攻破。

應用

雜湊的應用其實就在身邊,了解實際會如何使用,更能了解雜湊的這些特性對安全有什麼幫助。

Git commit

對開發者來說,這應該是最常見的應用了。

使用 git show 指令會顯示如下面的 commit 內容

commit f3a98188d57b18b6c829e58e67fecad51b23e972
Author: MilesChou <[email protected]>
Date: Wed Sep 25 00:58:59 2019 +0800

其中,有個像是身分證一樣的亂碼如下面的 f3a9818...,這個正是使用 commit 內容經過 SHA-1 演算法後產生出來的。會這麼做的主要原因有兩個:一個是為了產生唯一的 ID,另一個則是要 commit 不同的程式,但產生出一模一樣的 hash 來達成造假,是非常不容易的。

由此可以了解,Git 活用了碰撞抵抗的特性來保護原始碼的完整性。

區塊鏈

如同 Git,區塊鏈也是應用了雜湊來確保完整性:

每一個區段包含了前一個區段的加密雜湊、相應時間戳記以及交易資料,這樣的設計使得區段內容具有難以篡改的特性。

也有其他的應用,如比特幣是使用 SHA-256 來產生位址的,而從位址也無法反推原始的個人資料為何;以太坊則是用另一個演算法 Ethash 來產生雜湊。

checksum

比方說 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 還是非常方便的。

參考資料