1. 什麼是雜湊函數
雜湊函數是一種單向函數,可將任意大小的資料轉換為固定大小的數值。它具有雪崩效應:即使輸入僅有些微變化,也會產生完全不同的雜湊值,而相同的輸入永遠會產生相同的輸出。MD5 產生 128 位元、SHA-1 產生 160 位元、SHA-256 產生 256 位元的雜湊值。由於雜湊值是無法被還原的單向函數,非常適合在隱藏原始資料的同時驗證其完整性。廣泛應用於檔案下載驗證、密碼儲存、區塊鏈、數位簽章等領域。
將文字轉換為各種雜湊演算法。用於檔案完整性驗證、密碼雜湊與資料驗證。
雜湊函數是一種單向函數,可將任意大小的資料轉換為固定大小的數值。它具有雪崩效應:即使輸入僅有些微變化,也會產生完全不同的雜湊值,而相同的輸入永遠會產生相同的輸出。MD5 產生 128 位元、SHA-1 產生 160 位元、SHA-256 產生 256 位元的雜湊值。由於雜湊值是無法被還原的單向函數,非常適合在隱藏原始資料的同時驗證其完整性。廣泛應用於檔案下載驗證、密碼儲存、區塊鏈、數位簽章等領域。
MD5 是 1991 年開發的 128 位元雜湊演算法,速度非常快,但容易受到碰撞攻擊。2004 年發現的嚴重安全漏洞使其不適用於密碼學用途,目前僅用於檔案的檢查碼。SHA-1 是 160 位元雜湊,安全性優於 MD5,但 Google 在 2017 年公布實際碰撞案例後,該演算法已遭淘汰。SHA-256 屬於 SHA-2 家族,產生 256 位元雜湊值,是目前最廣泛使用的標準,比特幣也採用 SHA-256。SHA-512 以 512 位元提供更高的安全性,但速度較慢。新系統應採用 SHA-256 或更高等級的演算法。
雜湊函數有三大安全性要求。第一,原像抗性:應難以從雜湊值反推出原始資料。第二,第二原像抗性:應難以找到另一組輸入產生相同的雜湊值。第三,碰撞抗性:應難以找到兩組不同的輸入產生相同的雜湊值。MD5 與 SHA-1 的碰撞抗性已被攻破,攻擊者能刻意製造出相同的雜湊值。彩虹表攻擊會利用預先計算好的雜湊表回推原始資料,但加入鹽值可有效防禦此類攻擊。
檔案雜湊值是驗證下載檔案是否遭到竄改最有效的方法。軟體發佈網站通常會連同檔案一併提供官方雜湊值。使用者下載後計算檔案的雜湊值,並與官方數值比對。即使只有一個位元不同,也會產生完全不同的雜湊值,能立即偵測出遭竄改的情形。對於 Linux ISO 映像檔、開源軟體、區塊鏈交易等場景至關重要。Git 也會為每次提交產生 SHA-1 雜湊值,以確保程式碼的完整性。雜湊值也能用於偵測大型檔案傳輸過程中因網路錯誤造成的資料損壞。
絕對不要以明文形式將密碼儲存於資料庫中。密碼應轉換為雜湊值,但單純使用 MD5 或 SHA-256 並不足夠,因為容易受到彩虹表攻擊。必須加入鹽值(salt)。鹽值是附加在密碼上的隨機字串,能使相同密碼產生不同的雜湊值。此外,應使用如 bcrypt、scrypt 或 Argon2 等刻意設計得較慢的雜湊函數,藉由拖慢運算速度來提高暴力破解的難度。OWASP 建議優先採用 Argon2 作為密碼雜湊演算法。
彩虹表(Rainbow Table)是龐大的預先計算雜湊值資料庫,事先儲存數百萬組常見密碼的雜湊值,再與竊取到的雜湊值比對以還原出原始密碼。例如「password123」的 MD5 值永遠是「482c811da5d5b4bc6d497ffa98491e38」,因此能立即在彩虹表中被找到。加入鹽值即可防禦此類攻擊:為每位使用者附加獨一無二的隨機字串後,相同密碼會產生不同的雜湊值。將「password123」與「x8k2m9」一併雜湊後所得的數值,並不會出現在彩虹表中。鹽值本身可以明文儲存在資料庫中,但每組密碼都必須使用不同的鹽值才能發揮效果。