當你需要儲存使用者密碼、驗證檔案是否被竄改,或是保護傳輸中的敏感資料時,你會選擇「雜湊」還是「加密」?雖然它們都與資料安全有關,但用錯了地方可能會帶來災難性的後果。理解 Hashing 和 Encryption 的根本區別,是現代軟體開發的基礎。
1. 什麼是雜湊 (Hashing)?
雜湊,就像是為資料製作一個獨一無二的「數位指紋」。它透過一個數學函數(雜湊演算法),將任意長度的輸入資料,轉換成一個固定長度的字串,這個字串稱為「雜湊值」或「摘要」。
核心特性:單向性
雜湊是單向的 (One-Way)。你可以輕易地從原始資料產生雜湊值,但幾乎不可能從雜湊值反推回原始資料。就像你可以把水果放進果汁機打成汁,卻無法將果汁還原成原來的水果。
雜湊是單向的 (One-Way)。你可以輕易地從原始資料產生雜湊值,但幾乎不可能從雜湊值反推回原始資料。就像你可以把水果放進果汁機打成汁,卻無法將果汁還原成原來的水果。
雜湊的主要特點:
- 固定長度輸出:無論輸入是 1 個字元還是 1 GB 的檔案,輸出的雜湊值長度都是固定的(例如,SHA-256 永遠輸出 256 位元)。
- 確定性:相同的輸入永遠會產生相同的輸出。
- 雪崩效應:輸入資料哪怕只有一個微小的改變(例如一個字母的大小寫),輸出的雜湊值都會截然不同。
- 抗碰撞性:理論上,要找到兩個不同的輸入產生相同的輸出(稱為「碰撞」)是極其困難的。
常見演算法與用途:
- MD5:一個舊的、現已不安全的雜湊演算法。因容易產生碰撞,絕對不能用於密碼儲存或數位簽章,但仍可用於檔案的快速校驗(非安全性場景)。
- SHA (Secure Hash Algorithm):一個演算法家族,比 MD5 安全得多。
- SHA-1:已被證明不安全,應避免使用。
- SHA-256 / SHA-512:目前的主流標準,廣泛用於區塊鏈、數位憑證和密碼儲存。
主要應用場景:
- 密碼儲存:儲存使用者密碼的雜湊值而非明文。登入時,只需比對使用者輸入密碼的雜湊值與資料庫中的是否一致即可。(重要:必須加鹽!)
- 資料完整性驗證:下載軟體時,網站通常會提供一個 SHA-256 校驗碼。使用者下載後可以在本地計算檔案的雜湊值,與網站提供的比對,確保檔案在傳輸過程中未被竄改或損壞。
2. 什麼是加密 (Encryption)?
加密,則是將資料轉換成一種無法讀懂的格式(密文),目的是保護資料的「機密性」。與雜湊不同,加密是一個雙向的 (Two-Way) 過程。
核心特性:可逆性
只要你擁有正確的「金鑰」,就可以將密文解密 (Decrypt),還原成原始的明文資料。這就像一個上了鎖的保險箱,只有拿著鑰匙的人才能打開它看到裡面的東西。
只要你擁有正確的「金鑰」,就可以將密文解密 (Decrypt),還原成原始的明文資料。這就像一個上了鎖的保險箱,只有拿著鑰匙的人才能打開它看到裡面的東西。
常見演算法與用途:
- AES (Advanced Encryption Standard):目前最廣泛使用的對稱加密標準。你需要同一把金鑰來進行加密和解密。廣泛應用於 HTTPS、Wi-Fi 加密 (WPA2/3)、檔案壓縮 (ZIP/7z) 和磁碟加密。
- RSA / ECC:非對稱加密演算法。使用一對金鑰(公鑰和私鑰),公鑰加密的內容只能用私鑰解密。常用於安全地交換對稱金鑰(如 TLS 握手)和數位簽章。
主要應用場景:
- 保護傳輸中的資料 (Data in Transit):當你瀏覽 HTTPS 網站時,你的瀏覽器和伺服器之間的通訊就是用 AES 加密的。
- 保護儲存中的資料 (Data at Rest):對硬碟、資料庫或雲端儲存的敏感檔案進行加密,即使設備遺失或被盜,資料也不會外洩。
- 端到端加密通訊:像 Signal 或 WhatsApp 這樣的通訊軟體,確保只有發送方和接收方能讀取訊息內容。
3. 核心區別一覽表
| 特性 | 雜湊 (Hashing) | 加密 (Encryption) |
|---|---|---|
| 目的 | 驗證資料的完整性 | 保護資料的機密性 |
| 方向性 | 單向 (不可逆) | 雙向 (可逆) |
| 金鑰 | 不需要金鑰 (但需要鹽 `Salt` 來增強安全) | 必須使用金鑰 (對稱或非對稱) |
| 輸出 | 固定長度的唯一指紋 | 與原始資料長度相關的不定長度密文 |
| 常見演算法 | MD5, SHA-256, Argon2, bcrypt | AES, RSA, ChaCha20 |
| 主要問題 | 「如果我忘了密碼怎麼辦?」 → 無法還原,只能重設。 |
「如何安全地管理金鑰?」 → 金鑰洩漏等於資料洩漏。 |
4. 總結:何時用哪個?
選擇雜湊還是加密,取決於你的目的:
- 當你只需要驗證資料是否相符,而不需要知道原始資料時,請使用雜湊。
- 情境:儲存密碼、檢查檔案是否被修改。
- 當你需要保護資料內容,並預期未來會需要取回原始資料時,請使用加密。
- 情境:傳輸敏感訊息、加密備份檔案、保護使用者隱私資料。
黃金法則
用雜湊來驗證,用加密來隱藏。
用雜湊來驗證,用加密來隱藏。
下次當你處理敏感資料時,請先問自己:「我是需要一個無法偽造的指紋,還是一個可以上鎖和解鎖的保險箱?」這個問題的答案將直接引導你選擇正確的技術,為你的應用程式建立堅實的安全基礎。