雜湊和加密最根本的差別只有一句話:雜湊是單向的,加密是雙向的。
加密的目的是保密,所以必須能解回原文——你今天把資料加密,明天用對的金鑰一定要能解開,否則資料就永遠回不來了。雜湊的目的不是保密,而是驗證,它刻意設計成「算得出去、推不回來」,根本沒有「解雜湊」這回事。
把這個方向性記住,其他差異都能順理成章地推導出來。
雜湊函數把任意長度的輸入壓成固定長度的輸出,過程中刻意丟失資訊,因此無法還原。它的關鍵特性是:
正因為不可逆又確定,雜湊適合用在「只想確認是不是同一份東西、卻不需要看到原文」的場合,例如驗證密碼、檢查檔案完整性。想深入了解雜湊本身,可以讀什麼是雜湊函數。
加密把可讀的明文(plaintext)透過演算法與金鑰轉成看不懂的密文(ciphertext),日後再用金鑰解回明文。它的關鍵特性是:
加密又分兩類:
| 比較項目 | 雜湊 | 加密 |
|---|---|---|
| 方向 | 單向,不可逆 | 雙向,可解密 |
| 目的 | 驗證、完整性 | 保密 |
| 金鑰 | 不需要 | 需要 |
| 輸出長度 | 固定 | 隨內容變化 |
| 典型演算法 | SHA-256、MD5 | AES、RSA |
| 能否還原原文 | 不能 | 能(有金鑰時) |
這句話幾乎都是誤用。儲存密碼應該用雜湊(而且是 bcrypt、Argon2 這類密碼專用雜湊),不是加密。理由很簡單:用加密存密碼,代表系統握有能把密碼解回明文的金鑰,一旦金鑰外洩,所有密碼就全曝光了。用雜湊則根本沒有「解回明文」的途徑,登入時只要比對雜湊即可。詳見雜湊演算法安全性比較。
不是。加密可以解密,雜湊不能,兩者目的也不同。把雜湊稱作「加密」是最常見的術語錯誤,會在溝通與設計上造成實質的安全誤判。
更不是。Base64 是編碼,沒有金鑰、沒有保密效果,任何人都能直接還原,純粹是換一種方式表示資料。詳見文末說明。
用一個簡單原則來判斷:之後還需不需要拿回原始資料?
有時候兩者會搭配使用。例如數位簽章就是先對內容算雜湊,再用私鑰加密那個雜湊值——雜湊負責壓縮並偵測竄改,加密負責證明簽署者身分。
還有第三個容易和前兩者混淆的概念:編碼(Encoding),例如 Base64、URL 編碼。編碼只是把資料換成另一種表示形式,方便傳輸或儲存,它沒有金鑰、不提供任何保密,任何人都能直接解回原文。三者放在一起對照:
想實際感受雜湊「不可逆、確定性」的特性,可以打開工具輸入任意文字,觀察相同輸入永遠產生相同結果、而微小改動就讓輸出天差地別。
立即使用雜湊值產生器