想像一下,你可以取任何一段資料——一個單字、一部小說、一個 4 GB 的影片——並將其縮減為一串簡短的、固定長度的字元,用以唯一識別它。只要改變原始資料中的一個逗號,這串字元就會完全不同。而且無法逆轉這個過程來恢復原始資料。
這正是密碼學雜湊函數所做的事。它是現代安全的最基本構件之一,默默地保護著你在線上所做的幾乎一切。
指紋的比喻
雜湊就像數位指紋。你的指紋唯一識別你,但沒有人能從指紋還原你的面孔。同樣,密碼學雜湊唯一識別一段資料,而不會揭示那段資料是什麼。
將任何輸入送入雜湊函數,你就會得到一個摘要(也稱為雜湊值或校驗碼)——一串固定長度的十六進位字元。SHA-256 是最常見的演算法之一,無論輸入大小,始終產生 64 個字元的輸出。
| 輸入 | SHA-256 摘要(前 16 個字元) |
|---|---|
Hello |
185f8db32271fe25... |
hello |
2cf24dba5fb0a30e... |
| 整個維基百科資料庫 | (仍然是 64 個字元) |
四個基本特性
一個函數只有滿足以下特性才能稱為密碼學雜湊:
- 確定性。 相同的輸入在任何機器、任何時間始終產生相同的輸出。
- 單向性(原像抗性)。 給定一個雜湊值,在計算上不可能找到原始輸入。你無法「反雜湊」資料。
- 抗碰撞性。 實際上不可能找到產生相同摘要的兩個不同輸入。對於 SHA-256,意外碰撞的機率大約是 2^128 分之一——這個數字比可觀測宇宙中的原子數量還大。
- 雪崩效應。 改變輸入中的一個位元,輸出中大約一半的位元會翻轉。相似的輸入之間沒有可偵測的模式或關係。
關鍵區別: 雜湊不是加密。加密可以用金鑰反轉;雜湊是刻意不可逆的。你加密資料是為了在傳輸中保護它。你雜湊資料是為了驗證其完整性或儲存一個證明而不保留原始資料。
常見的雜湊演算法
MD5 (1991)
- 輸出: 128 位元(32 個十六進位字元)
- 狀態: 在密碼學上已被破解。研究人員可以在筆記型電腦上幾秒鐘內產生碰撞。
- 仍見於: 檔案下載的非安全校驗碼和遺留系統。
SHA-1 (1995)
- 輸出: 160 位元(40 個十六進位字元)
- 狀態: 安全用途已被棄用。Google 在 2017 年展示了實際碰撞(「SHAttered」攻擊)。
- 仍見於: 較舊的 Git 儲存庫、部分遺留憑證。
SHA-256 (2001)
- 輸出: 256 位元(64 個十六進位字元)
- 狀態: 目前的標準。無已知的實際攻擊。
- 用於: TLS 憑證、Bitcoin、密碼儲存、數位簽章、檔案完整性驗證。
SHA-3 (2015)
- 輸出: 可變(通常 256 位元)
- 狀態: 最新標準,基於與 SHA-2 家族完全不同的內部設計(Keccak 海綿結構)。
- 用於: 前瞻性系統、Ethereum、需要演算法多樣性的場景。
| 演算法 | 輸出大小 | 安全嗎? | 速度 |
|---|---|---|---|
| MD5 | 128 位元 | 否 | 非常快 |
| SHA-1 | 160 位元 | 否 | 快 |
| SHA-256 | 256 位元 | 是 | 中等 |
| SHA-3-256 | 256 位元 | 是 | 中等 |
密碼學雜湊的應用場景
密碼儲存
當你建立帳號時,一個設計良好的系統永遠不會以明文儲存你的密碼。它儲存的是雜湊值。當你登入時,系統對你輸入的內容進行雜湊並與儲存的值比較。即使資料庫被入侵,攻擊者得到的是雜湊值——而非密碼。
現代系統更進一步,在雜湊前加入隨機的鹽值(附加的額外資料),並使用刻意緩慢的演算法如 bcrypt、scrypt 或 Argon2,使暴力猜測變得不切實際。
檔案完整性驗證
軟體發行者會在下載頁面旁公佈 SHA-256 校驗碼。下載後,你在自己的機器上計算檔案的雜湊值並進行比較。如果匹配,則證明檔案在傳輸過程中未被損壞或竄改。
數位簽章
當你數位簽署一份文件時,系統先對文件進行雜湊,然後用你的私鑰加密雜湊值。接收者用你的公鑰解密,並與他們自己計算的文件雜湊值比較。這比加密整份文件效率高得多,同時證明了作者身分和完整性。
區塊鏈
區塊鏈中的每個區塊都包含前一個區塊的雜湊值,形成一條不可變的鏈。修改任何過去的交易都會改變其區塊的雜湊值,從該點開始破壞整條鏈,使竄改立即可見。
為什麼 MD5 和 SHA-1 被認為已破解
當有人能刻意建立產生相同雜湊值的兩個不同輸入(即碰撞)時,一個雜湊演算法就被「破解」了。這會削弱所有依賴唯一性的使用場景。
- MD5: 碰撞可以在幾秒鐘內產生。研究人員已經建立了具有相同 MD5 雜湊值的兩個不同 PDF 檔案。
- SHA-1: 2017 年的 SHAttered 攻擊產生了兩個具有相同 SHA-1 雜湊值的不同 PDF,大約需要 6,500 年的單 CPU 計算時間(使用雲端資源是可行的)。
實用準則: 永遠不要將 MD5 或 SHA-1 用於任何與安全相關的用途——密碼、憑證、數位簽章或可能有對手介入的完整性檢查。改用 SHA-256 或 SHA-3。
進階學習
雜湊是那種一旦你動手實驗就會變得直覺的概念。試著對一句話進行雜湊,然後改變一個字元,親眼觀察雪崩效應。
