Hashing
雜湊(Hashing)是將任意長度的資料轉換為固定長度摘要的單向函數,無法還原原始資料。
雜湊演算法分類
密碼學雜湊函數
用於資料完整性驗證、數位簽章等場景。
| 演算法 | 輸出長度 | 狀態 | 備註 |
|---|---|---|---|
| MD5 | 128 bits | ❌ 已不安全 | 存在碰撞攻擊,僅用於校驗和 |
| SHA-1 | 160 bits | ❌ 已不安全 | 2017 年已被實際碰撞攻擊 |
| SHA-256 | 256 bits | ✅ 安全 | SHA-2 家族,廣泛使用 |
| SHA-512 | 512 bits | ✅ 安全 | SHA-2 家族,適合高安全需求 |
| SHA-3 | 可變 | ✅ 安全 | Keccak 演算法,最新標準 |
密碼儲存專用
設計為運算緩慢,抵抗暴力破解。
| 演算法 | 特點 | 建議參數 |
|---|---|---|
| bcrypt | 內建 salt,可調整 cost | cost ≥ 10 |
| scrypt | 高記憶體消耗,抵抗 GPU | N=2^14, r=8, p=1 |
| Argon2 | 2015 年密碼雜湊競賽冠軍 | Argon2id,memory ≥ 64MB |
密碼儲存應使用 bcrypt、scrypt 或 Argon2,絕對不要使用 MD5、SHA-1 或純 SHA-256。
訊息驗證碼(MAC)
結合金鑰與雜湊函數,確保訊息完整性和來源真實性。
| 演算法 | 說明 |
|---|---|
| HMAC-SHA256 | 使用 SHA-256 的 HMAC |
| HMAC-SHA512 | 使用 SHA-512 的 HMAC |
| CMAC | 基於區塊加密的 MAC(如 AES) |
非密碼學雜湊
用於快速查找、資料分片,不適用於安全場景。
| 演算法 | 特點 | 用途 |
|---|---|---|
| CRC32 | 快速,錯誤偵測 | 檔案校驗和 |
| MurmurHash | 快速,分布均勻 | Hash Table、分片 |
| xxHash | 極快速 | 大量資料快速雜湊 |
| FNV | 簡單實作 | Hash Table |
應用場景對照
| 場景 | 建議演算法 |
|---|---|
| 密碼儲存 | Argon2id / bcrypt |
| API 簽章 | HMAC-SHA256 |
| 檔案完整性 | SHA-256 |
| Git commit ID | SHA-1(歷史原因) |
| 資料分片 | MurmurHash / xxHash |
| 重複檔案偵測 | SHA-256 |