§

Bcrypt 產生器

§

產生 Bcrypt 雜湊

10 (1,024 rounds)

Bcrypt 自 1999 年由 Provos 和 Mazières 推出以來,一直是美國網路開發中首選的密碼雜湊方案。NIST SP 800-63B 建議使用記憶體硬雜湊進行密碼儲存,OWASP 將 bcrypt 列為與 Argon2id 並列的偏好選項。Rails 透過 has_secure_password 內建了 bcrypt,Django 支援將其作為可插拔後端,Node.js 開發者使用 bcryptjs 函式庫。成本因子控制單一雜湊所需的時間——成本翻倍,工作量翻倍。多數應用以成本 10(1,024 輪)為基線,而金融或管理系統通常使用 12(4,096 輪)。此工具完全在瀏覽器中使用 JavaScript 執行,因此您的密碼絕不會離開您的裝置。

什麼是 bcrypt?

Bcrypt 是一種由 Niels Provos 和 David Mazières 設計的密碼雜湊函式,基於 Blowfish 密碼演算法。與 MD5 或 SHA-256 等快速摘要不同,bcrypt 故意設計得緩慢且計算密集——這使得對遭竊的密碼雜湊進行暴力攻擊變得不可行。Bcrypt 自動為每個密碼產生隨機鹽,因此相同的密碼會產生不同的雜湊。

bcrypt 是如何運作的?

Bcrypt 演算法完全在您的瀏覽器中執行。以下是逐步過程:

  1. 您的密碼被編碼為 UTF-8 位元組,然後輸入到 bcrypt 金鑰排程中,該排程使用密碼和鹽初始化 Blowfish 密碼演算法的 4,184 位元組 P 陣列和 S 盒。
  2. 產生一個隨機的 128 位元鹽。鹽被混入金鑰排程中,因此每個唯一的鹽即使對於相同的密碼也會產生完全不同的雜湊。
  3. 金鑰排程執行 2^cost 輪(例如,成本 10 時為 2^10 = 1,024 次疊代)。每次疊代會重新加密鹽和 P 陣列條目,使計算隨著成本增加而按比例變慢。
  4. 最終輸出是一個 60 字元的字串,格式為 $2b$<cost>$<salt><hash>,其中 cost 是零填補的(例如 10),salt 是 22 個 Base64 字元,hash 是 31 個 Base64 字元。
  5. 對於驗證,相同的演算法再次執行,使用候選密碼和從儲存雜湊中提取的鹽。如果衍生的雜湊與儲存的雜湊匹配,則密碼正確。

我應該使用哪個成本因子?

成本因子是疊代次數的對數——成本 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 實作執行。在儲存密碼前進行雜湊,驗證現有雜湊,調整成本因子以符合您的安全需求——一切都無需向伺服器發送一個位元組。