密碼熵:長度為何勝過複雜度——背後真正的數學
二十年來,密碼建議一直卡在某個版本的「要用大小寫、數字和符號」。但數學告訴我們那大部分是錯的——或者至少是優先順序完全顛倒。隨機產生的密碼強度由一個公式決定,而那個公式獎勵長度的方式,遠比獎勵更大的字元集來得積極。這也並非巧合——NIST 自從 SP 800-63B(2017 年發布,2024 年修訂)以來就一直這樣主張。
本文會帶你走過真正的數學、計算真實的熵值、給出明確標示假設的暴力破解估算,最後把它轉換成你可以實際應用的規則。
熵的公式
對於從大小為 P 的字元池中均勻隨機抽取、長度為 L 的密碼來說,可能的密碼數量是 P^L,以位元為單位的熵為:
H = log2(P^L) = L × log2(P)
這就是整個模型。熵衡量的是攻擊者必須枚舉的搜尋空間大小。每多一位 bit,工作量就翻倍。
兩個槓桿是 P(字元池大小)和 L(長度),它們並不相等。多加一個字元會讓搜尋空間乘以 P;擴大字元池則是讓搜尋空間乘以某個比例。以下是重要的字元池以及它們每字元的熵貢獻:
| 字元池 | 大小 (P) | 每字元位元數, log2(P) |
|---|---|---|
僅數字(0–9) | 10 | 3.32 |
僅小寫字母(a–z) | 26 | 4.70 |
小寫 + 大寫(a–zA–Z) | 52 | 5.70 |
英數混合(a–zA–Z0–9) | 62 | 5.95 |
| 完整可列印 ASCII(94 字元含符號) | 94 | 6.55 |
注意字元池擴張的邊際遞減:從僅小寫(26)升級到完整可列印集(94),字元池幾乎變成四倍,但每字元熵只從 4.70 升到 6.55 位元——39% 的增益。而在任何字元池大小下,從 8 個字元加到 16 個,熵正好翻倍。長度是線性增長、沒有天花板;字元池大小在標準鍵盤上限於約 94。
真實的熵值,計算出來的
套用 H = L × log2(P):
完整可列印 ASCII 字元池(94 字元):
| 長度 | 熵(位元) | 搜尋空間 |
|---|---|---|
| 8 | 52.4 | ~6.1 × 10^15 |
| 10 | 65.5 | ~4.4 × 10^19 |
| 12 | 78.7 | ~4.8 × 10^23 |
| 14 | 91.8 | ~5.1 × 10^27 |
| 16 | 104.9 | ~3.7 × 10^31 |
| 20 | 131.1 | ~2.9 × 10^39 |
僅小寫字母字元池(26 字元):
| 長度 | 熵(位元) |
|---|---|
| 8 | 37.6 |
| 12 | 56.4 |
| 16 | 75.2 |
| 20 | 94.0 |
英數混合字元池(62 字元):
| 長度 | 熵(位元) |
|---|---|
| 8 | 47.6 |
| 12 | 71.5 |
| 16 | 95.3 |
| 20 | 119.1 |
現在來看那個能讓重點一目了然的比較。看以下三組密碼,都是不同政策下合理的輸出:
xQ9#mK2!— 8 字元,完整 94 字元池:52.4 位元hkbwvztdpqrm— 12 字元,僅小寫:56.4 位元hkbwvztdpqrmjfyc— 16 字元,僅小寫:75.2 位元
「簡單的」12 字元小寫密碼已經勝過「複雜的」8 字元密碼,而 16 字元小寫密碼比它多出 23 位元——搜尋空間差距約 800 萬倍——而且更容易輸入和記住。多四個字元的價值超過整個符號集。
這就是「長度勝過複雜度」的意義:不是說複雜度毫無價值(在固定長度下,更寬的字元池永遠有幫),而是說人類在隨機產生複雜度方面非常糟糕,對任何實際的字元池來說,每加一個字元的邊際熵都超過擴大字元池所帶來的邊際熵。
巨大的警告:這只對隨機密碼有效
公式 H = L × log2(P) 假設的是均勻隨機抽取。人類挑選的密碼完全不是這樣。Summer2026! 是 11 字元、來自約 90 字元的池——名義上約 71 位元——但任何破解工具在前幾千次猜測內就會試到它,因為它是字典單字、年份、最常見的符号,以最常見的排列方式出現。
人類密碼的熵由可預測性主導,而不是由公式主導。對外洩密碼語料庫的實證分析一致發現,一小本常用密碼字典加上變形規則(首字母大寫、加數字、加 !),就能涵蓋真實密碼的很大一部分。這就是為什麼:
- 熵的數學適用於產生的密碼、來自單字表的片語,以及密碼管理器產生的密鑰——而不是任何人未借助工具發明的東西。
- 對於人類挑選的密碼,防禦手段不是估算熵,而是對已知外洩與常用密碼清單進行篩查——這正是 NIST 所要求的。
片語與 Diceware
Diceware 方法把可記憶密鑰的數學變得具體:擲骰子從 7,776 字的單字表中均勻選字(6^5)。每個單字帶來 log2(7776) ≈ 12.9 位元:
- 5 個單字:64.6 位元
- 6 個單字:77.5 位元
- 7 個單字:90.4 位元
像 correct horse battery staple 風格的 6 字片語(XKCD 那個著名的例子說明的是同一套數學),可以達到約 77 位元,可記憶性卻遠勝過隨機 12 字元字串的 78.7 位元。同一個安全等級,使用體驗天差地別。
暴力破解時間估算——附明確假設
任何「破解耗時」數字如果沒有其攻擊模型,就毫無意義。以下是一個明確標示的模型:
**假設:**針對快速、無加鹽雜湊(例如原始 MD5/SHA-1)的離線攻擊,速度為 10^10(100 億)次猜測/秒——這是一個中等規模多 GPU 設備就能達到的水準。對整個空間進行窮舉搜尋;找到密碼的期望時間是其中的一半。無節流、無外洩清單捷徑(這在假設隨機密碼的前提下是合理的)。
| 密碼類別 | 搜尋空間 | 10^10/s 下的窮舉時間 |
|---|---|---|
| 8 字元,僅小寫(26) | 2.1 × 10^11 | 約 21 秒 |
| 8 字元,完整字元池(94) | 6.1 × 10^15 | 約 7 天 |
| 12 字元,僅小寫(26) | 9.5 × 10^16 | 約 110 天 |
| 12 字元,完整字元池(94) | 4.8 × 10^23 | 約 150 萬年 |
| 16 字元,僅小寫(26) | 4.4 × 10^22 | 約 14 萬年 |
| 16 字元,完整字元池(94) | 3.7 × 10^31 | 約 1.2 × 10^14 年 |
把這些視為說明性的數量級,而非保證。它們會往兩個方向偏移:
- 實務上更慢,如果網站使用了合適的密碼雜湊函式。bcrypt、scrypt 或參數合理的 Argon2,相比原始 MD5 可以把猜測吞吐量降低 4 到 7 個數量級,把「約 7 天」變成「比任何人在意的熱寂時間表還長」。這就是為什麼雜湊演算法的選擇比使用者做的幾乎任何事都更重要。
- 更快,如果密碼不是隨機的(字典攻擊)、攻擊者擁有國家級硬體,或者在外洩雜湊仍然有價值的多年期間,摩爾定律式的改進持續累積。
- 線上攻擊(針對活生生的登入端點進行猜測)是完全不同的模型:速率限制和鎖定機制把攻擊者壓制在每秒數百次以內,所以即使約 20 位元的密鑰也能存活——這就是 NIST 要求節流的原因,也是為什麼你密碼管理器中每個網站不同的密碼比任何單一密碼的強度都重要。
這張表帶出的實務結論是:對任何會被快速雜湊的東西,8 字元都不夠,講完了;12 字元以上隨機字元就很舒服;16 字元是好的那種過度設計。 再說一次,16 字元小寫字串的壽命超過 12 字元完整字元池字串——長度獲勝。
NIST SP 800-63B 到底說了什麼
NIST 的《數位身分指南》(SP 800-63B,最初 2017 年;修訂版 4 於 2024 年發布)把上述許多內容編纂進了美國聯邦政策。對密碼(「記憶式密鑰」)驗證者具關鍵意義的建議如下:
- 規定最小長度,而非複雜度。 對使用者自選密碼要求至少 8 字元(修訂版 4 把單一因素密碼的門檻提高到 15 字元;在有第二因素時為 8 字元)。允許至少 64 字元。不要施加組合規則(不要「必須含大寫、數字、符号」)——那會把使用者推向可預測的模式(
Password1!),削弱真實世界的安全性。 - 不強制定期更換。 2017 年修訂已經廢除了「每 90 天輪換」的舊教條;修訂版 4 再次確認這一點。只有在有證據顯示外洩時才更換密碼。強制輪換穩定地產生
Summer2026!→Autumn2026!——這種增量變化,破解規則能輕鬆涵蓋。 - 對外洩與常用密碼清單進行篩查。 驗證者應把候選密碼與已知外洩密碼、字典單字、重複/連續字串、上下文特定單字(服務名稱、使用者名稱)的字典進行比對。這取代了組合規則,成為人類自選密鑰的真正防禦。
- 允許貼上與密碼管理工具。 驗證者必須允許貼上輸入——這是對密碼管理器的明確背書,因為指南希望使用者持有的正是隨機產生的 20 字元字串。
- 禁止基於知識的提示或安全問題。 密碼提示和 KBA(「母親的娘家姓」)被禁止,因為它們會洩漏或輕易暴露密鑰。
- 加鹽、記憶體困難型的雜湊用於儲存。 驗證者必須使用合適的單向函式雜湊後再儲存密碼——指南指向 Argon2、bcrypt 或具備足夠工作因子的 PBKDF2 等方案,並為每個使用者加上至少 32 位元的鹽。
注意這些規定如何與熵的數學互相呼應:組合規則對人類來說並未增加真正的熵,但長度可以;輪換會在使用者好不容易累積的熵上把他們推向模式化,從而摧毀它;外洩清單篩查則處理了「人類熵無法衡量」這一事實。這個標準就是把數學制度化。
你能實際使用的規則
- 讓產生器為你產生密碼。 隨機產生是熵公式唯一適用於你的方式。我們的密碼產生器在你的瀏覽器中產生加密隨機的密碼——不會傳輸到任何地方。把它設成 16 字元以上,然後別再想它。
- 重要的事預設用 16 字元。 即使僅小寫也有 95 位元以上,你已經超越任何針對合適雜湊儲存的暴力破解預算。
- 必須記住的東西,用 6 字片語。 約 77 位元、可輸入、可記憶。如果有的話,用該工具的片語/wordlist 模式產生,或使用 Diceware。
- 每個網站獨立,永遠。 熵保護一個網站;重複使用會把一次外洩變成所有外洩。這正是密碼管理器的用途。
- 哪裡提供第二因素就加上。 NIST 的長度要求在有 MFA 時明確放寬,因為第二因素以遠比更多密碼熵更便宜的方式倍增了攻擊者的工作量。
- 忽略複雜度儀式。 一個網站要求「一個大寫、一個數字、一個符號」卻把你限制在 12 字元以內,那是把政策搞反了。機械式地遵守,但別把它當成強度。
總結
- 隨機密碼的熵是
H = L × log2(P):每個字元根據字元池大小增加固定數量的位元。 - 字元池擴張(26 → 94 字元)每字元只增加約 1.85 位元;每多一個字元則增加 4.7 到 6.6 位元。長度決定性地獲勝。
- 8 個隨機字元 ≈ 52 位元 ≈ 在快速離線雜湊下數天可破;12 個隨機字元 ≈ 78 位元以上 ≈ 在該模型下實際上無法破解。
- 這個公式只適用於隨機產生。人類自選的密碼會被字典擊敗,這就是 NIST 強制外洩清單篩查、禁止組合規則與強制輪換的原因。
- 用密碼產生器產生 16 字元隨機密碼,存進密碼管理器,啟用 MFA。這套組合就是數學所推薦的。