為什麼單純的雜湊不足以保護密碼?
在現代網頁應用開發中,直接將使用者密碼以明文儲存是嚴重的資安漏洞。即便使用了 MD5 或 SHA-256 等雜湊演算法,若沒有額外的保護機制,駭客仍能透過「彩虹表(Rainbow Tables)」進行快速比對,輕易還原出原始密碼。單純的雜湊值在面對硬體運算能力大幅提升的今日,已經顯得不堪一擊。
鹽(Salt)的運作原理與重要性
「鹽」是一串隨機生成的字串,在進行雜湊運算前與使用者的密碼合併。其核心目的是讓相同的密碼在儲存時產生完全不同的雜湊值。即使兩位使用者設定了相同的密碼,只要資料庫中的鹽值不同,最終儲存的雜湊結果也會截然不同,這徹底消除了彩虹表攻擊的威脅。
專家建議:鹽值必須是唯一的,且建議針對每一位使用者個別產生。儲存時,鹽值通常與雜湊值一併存放於資料庫中,因為它不需要隱藏,只需確保其隨機性。
胡椒(Pepper)的額外防禦層
與鹽不同,「胡椒」是一種儲存在應用程式設定檔或環境變數中的秘密字串。它不會存放在資料庫中,因此即便資料庫遭到洩漏,駭客若沒有取得伺服器端的設定檔,也無法進行有效的離線破解。這為密碼儲存增加了最後一道防線。
常見密碼儲存方案比較
| 機制 | 存放位置 | 主要防禦目標 | 安全性層級 |
|---|---|---|---|
| 純雜湊 | 資料庫 | 無 | 極低 |
| 加鹽 (Salt) | 資料庫 | 彩虹表攻擊 | 中等 |
| 加胡椒 (Pepper) | 伺服器環境變數 | 資料庫洩漏後的暴力破解 | 高 |
如何正確實作密碼防護策略
在實作時,請確保使用如 Argon2、bcrypt 或 scrypt 這類具備「工作因子(Work Factor)」的演算法。這些演算法故意設計得較為緩慢,進一步限制了駭客使用 GPU 大規模嘗試破解的速度。結合鹽與胡椒的雙重防護,可以將系統的安全性提升到企業級標準。
維持系統安全性的長期維護
資安防護並非一勞永逸。隨著運算能力的演進,過去被認為安全的演算法可能會過時。建議定期審查系統的雜湊策略,並確保所有的加密金鑰與胡椒值都有輪替機制,以面對未來可能出現的計算威脅。