核心建議:用 bcrypt、用 bcrypt、用 bcrypt……(重要的話說三遍)
為什麼不能用 MD5、SHA-1、SHA-256、SHA-512、SHA-3?
這些都是通用哈希函數,設計初衷是極速計算海量數據摘要,以保證數據完整性。但對「存儲密碼」而言,速度快是致命缺陷。
暴力破解有多快?
- 現代服務器計算 MD5 约 330 MB/s。若密碼僅含小寫字母數字、長度 6 位,40 秒即可窮舉破解,零成本。
- 投入 2000 美元購買 CUDA 顯卡,一兩周搭建小型集群,算力達 7 億次/秒,以每秒 10% 速度破解此類密碼。
加鹽(Salt)救不了你
極其重要:鹽值對字典攻擊和暴力破解無效。無論你用粗鹽、大量鹽、甚至「有機喜馬拉雅粉晶鹽」,只要底層是為速度設計的通用哈希,攻擊者破解速度不變。鹽值只能防彩虹表預計算,無法提高單次驗證成本。
bcrypt 如何解決問題?
核心機制:慢到令人發指。源自 Blowfish 加密算法,引入功因子,可人為調節計算強度,緊跟摩爾定律——硬體越快,功因子越大,哈希越難算。
強度對比(功因子 12)
- bcrypt 哈希「yaaa」約需 0.3 秒。
- MD5 處理同樣輸入 < 1 微秒。
- 差距超過 30 萬倍。
你可根據業務在「速度」與「安全」間平衡:調高功因子提升安全,調低加快驗證。
最佳實踐建議
- 所有新系統統一採用 bcrypt(或 Argon2、PBKDF2、scrypt 等慢哈希)。
- 舊系統遷移:在用戶下次登錄時,用 bcrypt 重新哈希並覆蓋舊值。
- 功因子建議 ≥ 12(2024 年基準),隨硬體升級定期調高。
- 切勿自行設計加密方案,使用成熟庫(如 Python `bcrypt`、Node `bcryptjs`、Java `BCrypt`、Go `golang.org/x/crypto/bcrypt`)。
總結:密碼存儲唯一正確選擇是專為「慢」而設計的自適應哈希函數。bcrypt 經過二十年實戰考驗,仍是黃金標準之一。