密碼安全性:如何產生、儲存與稽核強密碼
快速解答
使用我們的密碼產生器產生 16 個以上字元的隨機密碼,切勿重複使用它們,並將它們儲存在密碼管理器中。在伺服器上,使用 bcrypt(工作因子 12+)、scrypt 或 Argon2id 進行雜湊處理 — 切勿使用 MD5 或 SHA-256。透過 Have I Been Pwned 的 k-匿名 API 進行審計違規。切勿傳輸或記錄明文密碼。
介紹
大多數帳戶被盜的原因是弱密碼、重複使用的密碼和儲存不當的密碼。本指南解決了四個特定問題:(1) 產生具有足夠熵的密碼以抵抗暴力破解,(2) 使用慢速 KDF 而不是快速哈希對密碼進行哈希處理,(3) 避免跨服務重用,以及 (4) 審核洩露的憑證。每個解決方案都是可操作的並且有工具支援。
步步
-
產生高熵密碼
使用密碼產生器建立一個包含大寫字母、小寫字母、數字和符號的 16 個以上字元的密碼。熵 = log2(charsetSize^length);由 94 個符號組成的 16 個字元的字母表給出約 105 位,即使每秒猜測 10^12 次,也無法透過暴力破解。
-
切勿跨服務重複使用密碼
重複使用一個密碼意味著一次洩漏就會危及共享該密碼的每個帳戶。為每個服務產生唯一的密碼並將其儲存在密碼管理器(Bitwarden、1Password、KeePassXC)中。主密碼是您唯一需要記住的密碼,請將其設定為長密碼。
-
在伺服器上使用慢速 KDF 對密碼進行雜湊處理
切勿使用 MD5、SHA-1 或原始 SHA-256 儲存密碼 - 它們太快了,GPU 每秒可以嘗試數十億次。使用工作因子為 12+ 的 bcrypt、N=2^17 的 scrypt 或具有 64MB 記憶體的 Argon2id。這些 KDF 故意緩慢且記憶體困難,以抵禦 GPU/ASIC 攻擊。
-
用鹽打敗彩虹桌
鹽是每個密碼的唯一隨機值,在散列之前添加或組合。它確保相同的密碼產生不同的雜湊值,從而使預先計算的彩虹表毫無用處。 bcrypt 和 Argon2 自動產生並嵌入鹽——不要自己動手。
-
審核密碼外洩狀況
在接受密碼之前,請使用 k-匿名協議對照 Have I Been Pwned API 進行檢查:僅發送 SHA-1 哈希的前 5 個字符,接收匹配後綴的列表,並在本地進行比較。這永遠不會洩漏 API 的完整密碼。
範例
產生的強密碼(16 個字符,~105 位熵)
輸入: 長度 16,所有字元類別
輸出: K9$mP2#vL7@nQ4!x(隨機、唯一、從未重複使用)
主密碼的密碼(好記+強)
輸入: 4個隨機常用詞
輸出: correct-horse-battery-staple (~44 bits but easy to remember; use 5-6 words for ~60+ bits)
密碼的 bcrypt 雜湊值(工作因子 12)
輸入: 密碼 123 與 bcrypt 成本 12
輸出: $2b$12$N9qo8uLOickgx2ZMRZoMy.MrqKQp7vqB4V1e5sTq7vqB4V1e5sTq(鹽+成本+嵌入雜湊)
常見問題
- 使用 MD5 或 SHA-256 進行密碼雜湊:兩者都是快速雜湊。現代 GPU 的運算速度約為 100 億次 SHA-256/s,可在幾分鐘內破解 8 個字元的密碼。始終使用 bcrypt、scrypt 或 Argon2id。
- 跨站點重複使用一個密碼:最薄弱的站點的漏洞會洩露每個站點的密碼。產生唯一的密碼並將其儲存在管理員中。
- 以明文或可逆加密方式儲存密碼:如果資料庫洩漏,每個帳戶都會立即受到損害。雜湊是單向且不可逆的——即使伺服器也無法恢復原始資料。
- bcrypt 的工作因素較低:2002 年成本 4 還可以;到 2026 年,使用成本將達到 12+(約 4096 次迭代)。登入時重新哈希以升級舊哈希,而無需強制重置密碼。
提示
- 高價值帳戶的目標是至少 100 位熵,即 94 個符號字母表中的 16 個隨機字符,或 6 個隨機骰子單字。
- 為每個支援它的帳戶啟用雙重認證(TOTP 或硬體金鑰)—如果密碼被釣魚,僅使用強密碼是不夠的。
- 當密碼將被大聲讀出或從列印中鍵入時,請使用我們的密碼產生器的「排除模糊字元」選項(0/O、1/l/I)。
- 僅在確認違規後輪換密碼,而不是按固定時間表輪換密碼-強制輪換會促使用戶採用可預測的模式,例如 Spring2026! 。