Bcrypt 雜湊與驗證

在瀏覽器中為密碼生成加鹽 bcrypt 雜湊,並用明文驗證已有雜湊。

在瀏覽器中為密碼生成加鹽 bcrypt 雜湊,並用明文驗證已有雜湊。 在瀏覽器中為密碼生成加鹽 bcrypt 雜湊,並用明文驗證已有雜湊。

生成的 bcrypt 雜湊

背景知識

什麼是 bcrypt,為什麼它很重要

bcrypt 是 1999 年由 Niels Provos 和 David Mazieres 設計的自適應密碼雜湊函式。 與 MD5、SHA-256 這類快速摘要不同,bcrypt 有意消耗 CPU 時間:每次雜湊都會以可 配置的輪數執行 Blowfish 加密演算法,成本因子每增加 1,工作量就翻一倍。這種減速 正是讓離線字典攻擊和暴力破解變得昂貴的原因。正確的 bcrypt 實現還會把 128 位 隨機鹽嵌入輸出字串,因此同一密碼的兩次雜湊結果總是不同,彩虹表對它也毫無 用處。

如何讀懂 bcrypt 雜湊

一個 bcrypt 雜湊形如 $2b$12$e0.6kJ8a5X8u5Yp3qR5E0e9dF4z3W2c1v0b9n8m7l6k5j4h3g2f1。 開頭的美元符號分隔的各段攜帶演算法版本、成本和鹽:

  • $2b$ -- 演算法修訂版本。$2a$ 與 $2y$ 是較老的變體,對 8 位符號位缺陷的 處理略有不同;$2b$ 是當前推薦版本,也是 bcryptjs 的輸出格式。
  • 12 -- 成本因子。2^12 = 4096 輪金鑰擴充套件。每 +1 時間翻倍;互動式登入預設 10-12 即可,儲存憑據可用 12-14。
  • 其餘 53 個字元包含 22 字元(128 位)base64 鹽和 31 字元(184 位)校驗和。 整個字串是一條自包含記錄:驗證器從雜湊中讀回版本、成本和鹽,重新執行 派生流程進行比對。

如何使用本工具

在輸入框中輸入密碼,選擇成本因子,然後點選"生成雜湊"。生成的雜湊會出現在 輸出框中,並同時填入驗證欄位。要檢查已有雜湊,把雜湊貼上到驗證欄位,然後在 輸入框中輸入候選密碼:頁面會立即比對,顯示綠色對勾或紅色叉號。由於比對使用 bcrypt.compareSync 完成,它永遠不會暴露錯誤猜測的接近程度——每次嘗試都會完整 雜湊後才得出結果。

安全說明與侷限

bcrypt 會把輸入截斷到 72 位元組:更長的密碼會被靜默截斷,因此前 72 位元組相同的 兩個密碼會被判定相等。如果需要更長輸入,先用 SHA-256(十六進位制)預雜湊,再對 摘要做 bcrypt。bcrypt 是刻意輕記憶體的演算法——它對 GPU 陣列的抵抗不如 Argon2 或 scrypt 這類記憶體硬演算法,但 4KB 表和 64 位元組狀態仍然讓廉價的 ASIC 破解缺乏吸引 力。全新系統通常更適合 Argon2id;bcrypt 依然是相容性極好、廣受支援的選項, 尤其適合無法提供 Argon2 的執行環境。本頁面完全在瀏覽器中執行:密碼和雜湊 永遠不會離開你的裝置,程式碼路徑(MIT/BSD 的 bcryptjs)已內置於 public/assets。

使用 BSD-3-Clause 協議的 bcryptjs 庫(已內置於 public/assets)。雜湊在本地完成,不傳輸任何資料。

常見問題

為什麼同一個密碼每次生成的雜湊都不一樣?
每次雜湊都會生成一個 128 位隨機鹽並嵌入輸出中。驗證時會從雜湊中重新讀取鹽,因此正確性不受影響,但相同輸入永遠不會產生相同輸出。
我應該使用多大的成本因子?
互動式登入建議 10-12;儲存憑據可以用 12-14。成本越高越安全但越慢,請選擇伺服器每次登入可承受的最大值。
2026 年 bcrypt 仍然推薦嗎?
是的。bcrypt 依然廣泛部署,成本 ≥10 時被認為是安全的。全新系統通常更傾向記憶體硬演算法 Argon2id 或 scrypt,但 bcrypt 仍是經過實戰檢驗的優秀選擇,尤其在無法使用這些演算法時。
為什麼 bcrypt 比 SHA-256 慢?
這正是它的設計目的。SHA-256 追求速度,攻擊者每秒可嘗試數十億次猜測;bcrypt 昂貴的金鑰擴充套件和鹽迫使攻擊者為每次猜測付出真即時間,使離線攻擊變得不切實際。
72 位元組限制對我的密碼意味著什麼?
bcrypt 會忽略第 72 位元組之後的內容。超過 72 位元組且字首相同的兩個密碼會被驗證為相同。要支援更長的秘密,先用 SHA-256(十六進位制)雜湊再對摘要做 bcrypt。
我的密碼會被髮送到伺服器嗎?
不會。所有操作都在瀏覽器本地使用內建的 bcryptjs 庫完成。頁面載入後即使斷網也能正常工作。