什麼是 bcrypt?
Bcrypt 是一種由 Niels Provos 和 David Mazières 設計的密碼雜湊函式,基於 Blowfish 密碼演算法。與 MD5 或 SHA-256 等快速摘要不同,bcrypt 故意設計得緩慢且計算密集——這使得對遭竊的密碼雜湊進行暴力攻擊變得不可行。Bcrypt 自動為每個密碼產生隨機鹽,因此相同的密碼會產生不同的雜湊。
bcrypt 是如何運作的?
Bcrypt 演算法完全在您的瀏覽器中執行。以下是逐步過程:
- 您的密碼被編碼為 UTF-8 位元組,然後輸入到 bcrypt 金鑰排程中,該排程使用密碼和鹽初始化 Blowfish 密碼演算法的 4,184 位元組 P 陣列和 S 盒。
- 產生一個隨機的 128 位元鹽。鹽被混入金鑰排程中,因此每個唯一的鹽即使對於相同的密碼也會產生完全不同的雜湊。
- 金鑰排程執行 2^cost 輪(例如,成本 10 時為 2^10 = 1,024 次疊代)。每次疊代會重新加密鹽和 P 陣列條目,使計算隨著成本增加而按比例變慢。
- 最終輸出是一個 60 字元的字串,格式為
$2b$<cost>$<salt><hash>,其中 cost 是零填補的(例如 10),salt 是 22 個 Base64 字元,hash 是 31 個 Base64 字元。 - 對於驗證,相同的演算法再次執行,使用候選密碼和從儲存雜湊中提取的鹽。如果衍生的雜湊與儲存的雜湊匹配,則密碼正確。
我應該使用哪個成本因子?
成本因子是疊代次數的對數——成本 10 意味著 2^10 = 1,024 輪,成本 12 意味著 4,096 輪。根據您的安全需求和硬體選擇:
- 成本 4-6(16-64 輪)——僅用於開發和測試。對生產環境來說太快了,提供的保護很少。
- 成本 8(256 輪)——非關鍵應用的最低要求。在現代硬體上大約 6 毫秒。
- 成本 10(1,024 輪)——目前建議的基準。大約需要 25 毫秒。適用於大多數網頁應用。
- 成本 12(4,096 輪)——建議用於管理入口網站、金融系統和高安全性應用。大約需要 100 毫秒。
- 成本 14(16,384 輪)——高安全性。大約需要 400 毫秒。用於主密碼、加密金鑰或登入延遲可接受的情況。
為什麼使用這個 bcrypt 產生器?
- 隱私保護——每個密碼都在您的瀏覽器中本機雜湊,資料絕不會離開您的裝置。
- 雙模式——無需切換頁面即可並排產生新雜湊或驗證現有雜湊。
- 可調成本因子——從 4(快速)到 15(非常慢)調整工作因子,以滿足您的應用安全需求。
- 標準相容——產生的雜湊使用標準的
$2b$格式,相容於所有主流語言和框架。
bcrypt 的常見應用有哪些?
Bcrypt 廣泛應用於業界中的密碼儲存和驗證:
- 網頁應用使用者認證——將使用者密碼雜湊儲存在資料庫中,從而永遠不儲存明文密碼。
- API 金鑰雜湊——在儲存前對 API 金鑰進行雜湊,這樣資料庫外洩不會暴露有效憑證。
- 遷移稽核——驗證來自舊系統的舊密碼雜湊在升級認證層後仍能驗證使用者。
bcrypt 雜湊長什麼樣子?
使用成本因子 10 對密碼 hunter2 進行雜湊會產生類似 $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy 的字串。格式分解為:$2b$(演算法版本)、10(成本因子)、$,然後是 22 個字元的鹽和 31 個字元的雜湊,全部採用 Base64 編碼。每次使用相同的密碼執行都會因為隨機鹽而產生不同的雜湊。
這個 bcrypt 產生器完全在您的瀏覽器中使用純 JavaScript 實作執行。在儲存密碼前進行雜湊,驗證現有雜湊,調整成本因子以符合您的安全需求——一切都無需向伺服器發送一個位元組。