簡介雜湊
雜湊(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 |
其中,有個像是身分證一樣的亂碼如下面的 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 |
以第一行的內容來舉例,它代表對下載回來的 debian-10.1.0-amd64-netinst.iso
檔案做 MD5 運算的話,會得到 b931ef8736c98704bcf519160b50fd83
的結果。因雜湊只要內容有變,產生出來的結果就會大為不同,若下載過程有掉封包,或是下載過程被中間人攻擊插入惡意的檔案,都會在檢查雜湊結果的時候發現,這能有效確保完整性。
儲存密碼
在 Google 搜尋「密碼外洩」會發現非常多這樣的事件。雖然大家在設計服務的時候,都會把資料庫放在最安全的地方,但「道高一尺,魔高一丈」,功力高強的駭客還是有機會鑽漏洞進到服務裡面偷資料。如果資料庫裡面的會員密碼是用明文保存的話,那這將會成為下一個密碼外洩事件。
以密碼這個資料來說,相較安全的做法是把密碼做雜湊後,再放到資料庫裡。因雜湊具有 preimage resistance 的特性,即便資料庫被偷走,攻擊者也難以從雜湊回推原始輸入,如此一來,會員資料的安全性就提升了不少。
小結
如果有高度安全需求的話,目前 SHA-2 與 SHA-3 是建議採用的演算法。其他演算法如 MD5 雖然安全性不足,但效能與通用性(如語言直接內建或指令內建)依然不輸 SHA 家族,因此單純檢查下載檔案的完整性,使用 MD5 還是非常方便的。
參考資料
- MD5 - 維基百科
- SHA - 維基百科
- RFC 1321
- 金融短訊:SHA 安全雜湊算法
- 【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的? - 為你自己學 Git