一個真正的密碼強度檢查器替代方案完全在您的瀏覽器中執行,從不上傳您貼上的密碼,並清楚顯示哪些規則產生了它給出的分數。密碼強度檢查器符合這樣的描述:它計算 Unicode 碼點,僅標記使用者能閱讀並理解的狹窄模式,並依據長度與兩個簡單的模式檢查,從五個標籤中指派一個 — Weak、Fair、Good、Strong,或在輸入為空時為零。它拒絕宣告破解時間,拒絕假裝已將您的字串與遠端外洩資料庫進行比對,也拒絕強制套用那種主要以可預測字元替換來訓練使用者的固定「大寫加數字加符號」配方。相反地,它遵循現行 NIST SP 800-63B 指引的精神,該指引警告說,當帳號缺乏其他保護時,使用者自行選定的密碼若少於約 15 個字元即屬於弱密碼。本頁其餘部分將說明為何這種在地、透明的作法才是正確的替代方案、如何透過三個具體步驟使用此工具,以及這個計分器刻意不會取代的額外防禦措施。

password strength checker alternative
正在尋找密碼強度檢查器的替代方案嗎?

為何一般線上檢查器不再有用

「密碼強度檢查器」這個詞描述了一類看起來有用、卻在三個可衡量方面辜負讀者的網頁。其中許多會將您輸入的內容傳送到遠端伺服器進行處理,這意味著您真實密碼的副本現在存放在您無法掌控的基礎設施中。其他則回報「位元熵」數值或破解時間預估,而這些是根據該網站實際上無法觀察到的攻擊者行為模型計算出來的;NIST SP 800-63B 以平實的語言指出,對使用者選定的密碼估算熵是困難的,因此精確的數字只是表演,而非衡量。還有一些則強制套用固定配方 — 一個大寫字母、一個數字、一個符號 — 而數十年的事件資料顯示,這會訓練人們把「a」換成「@」、「o」換成「0」,讓密碼既可預測、又只略為變長。結果是,真正想知道候選密碼是否可接受的人,在離開這些頁面時反而比剛進來時更困惑。

替代方案必須在上述每一點上反其道而行:將密碼保留在本地、公布驅動分數的規則、並拒絕提出任何誠實檢查無法給出的保證。這正是密碼強度檢查器所建立的目標。

一個真正在地的替代方案是什麼樣子

一個有用的替代方案會做四件事,並刻意迴避第五件。它只在使用者已開啟的瀏覽器分頁中執行,因此提議的密碼從不離開您的機器。它展示其運作過程:所計算的長度、所辨識的字元群組,以及(若有)所標記的模式。它使用簡短且具名稱的尺度來指派標籤,而非暗示虛假精確度的一長串小數位數。它指引您走向互補的防禦 — 密碼管理器中的唯一一筆紀錄、帳號提供者的外洩或被盜憑證檢查,以及多因素驗證 — 而不是假裝能取代它們。它刻意迴避的第五件事,則是編造一個保證的破解時間或位元熵計數,因為那些數字取決於沒有任何離線計分器能稽核的攻擊者模型、外洩資料庫與字典。

該實作符合此約定。計分器計算的是 Unicode 碼點而非 UTF-16 單位,這很重要,因為像 🎉 這類表情符號就密碼用途而言是單一碼點,而非兩個。它會回報出現了哪些廣義群組 — 小寫、大寫、數字、符號、空白字元與非 ASCII — 僅作為描述性註記,而非您必須勾選的檢查清單。它執行兩個狹隘且可解釋的模式檢查:一段長度一至四個碼點且至少重複三次的片段,以及一段長度四個、嚴格遞增或遞增差一的碼點序列。這是它唯一能標記的模式。

三步執行密碼強度檢查器

  1. 貼上或輸入候選密碼。該欄位預設為遮罩顯示,僅在您按下顯示控制鈕時才會顯示內容,因此肩窺是此步驟中最大的實際風險。輸入內容從不透過網路傳送,也從不寫入儲存裝置;稽核會在相同分頁中執行並在該處結束。
  2. 閱讀計分器回傳的四項回饋。第一項是 Unicode 碼點長度,這是分數所依據的數字。第二項是字元群組的描述性計數,讓您了解字串擁有的變化性,而無須把變化性變成通過或不通過的規則。第三項是模式標記,內容是「無模式」或一個簡短詞組,指出它所偵測到的重複或序列。第四項是五級標籤與下方的建議區塊。
  3. 根據標籤、而非僅憑標籤決定下一步。Weak 或 Fair 標籤是將密碼加長或完全重新挑選的訊號;Good 或 Strong 標籤則是繼續下去的許可,但須取決於下方其餘工作流程的執行結果。如果您使用了 passphrase,請再次確認該服務確實接受並以計分器相同方式正規化空格、附有腔調的字元或表情符號。

五個分數級距及其觸發條件

這些標籤刻意設計得很粗略,以便您不必查閱手冊即可閱讀。門檻屬於回饋規則,而非聲稱每個長字串都是安全的;一個被重複用作密碼的名言,無論有多少字母,仍然可被猜到。下表列出文件所記載的界限。

標籤Unicode 碼點長度模式標記
零輸入為空不予評估
Weak少於 8任一
Fair8 至 14,或任何長度但出現重複或序列模式任一
Good15 至 19無模式
Strong20 或以上無模式

這些規則帶出兩個結果。第一,由二十八個隨機字元組成、未含任何重複片段或單調序列的字串,可獲得 Strong;一個含有「abcd」或「dcba」等四字母序列的十六字元字典詞組,則最高只能獲得 Fair,即使它跨越了 15 字元的界限。第二,您所獲得的級距是文件所記載檢查的函數,因此兩組相同長度與相同群組計數的密碼,除非其中一組觸發了模式標記,否則不會落在不同級距。這是有意為之:計分器寧可保持可預測,也不要出人意表。

計分器刻意不告訴您的內容

一個誠實的替代方案也會清楚說明它無法檢查的事項。此工具不會下載已外洩密碼的資料庫、不會將部分雜湊送至外洩服務,也不會假裝知道您的候選字串是否曾出現在公開的外洩事件中。OWASP 身分驗證備忘單明確指出,正式環境的驗證程式必須將完整提議密碼與常見、預期及已遭入侵的值之現行封鎖清單進行比對,而這個在地計分器也坦白說明它不是那種正式環境的驗證程式。即使在地標籤顯示為 Strong,仍請遵循帳號提供者自身的外洩警示。

計分器同樣不要求任何特定字元群組。一個完全由小寫單字與空格組成的二十字元 passphrase 也能獲得 Strong,因為真正發揮作用的是長度與唯一性,而描述性的群組列表只是給讀者參考。強制的組成規則往往會驅動可預測的模式,例如將首字母大寫並附加「1!」 — 這正是字典加規則式攻擊者最擅長破解的那類密碼,也正是 NIST SP 800-63B 視為弱密碼的那類密碼。在地計分器接受相同結論:組成只是描述性的,而非一道關卡。

模式偵測刻意設計得很狹隘。計分器能抓出「abcabcabc」或「12341234」,因為兩者都會觸發重複或序列規則,但它不會辨識「qwerty」、電影台詞、您的狗名加上某個年份,或您從熟悉的外洩彙整中複製的詞組。「無模式」僅代表那兩個狹隘檢查未觸發,並不代表該密碼是新穎的。若想更深入了解相同邏輯在程式碼中如何處理棘手情況,在不使用正規表示式陷阱的情況下以 Python 檢查密碼強度這份指南,會在腳本情境中介紹相同的長度加模式架構。

超越在地稽核

這個分數是起點,而非終點。三個額外步驟能將 Strong 標籤轉化為有防禦的帳號。首先,以密碼學上安全的隨機來源產生密碼,並儲存於密碼管理器 — 密碼產生器在本地執行,能產生計分器調校為給高分的那類隨機字串。其次,當帳號提供者提供封鎖清單時,將完整值與其比對;許多提供者在伺服器端執行此類比對,並對符合已知外洩的值加以拒絕或提出警語。第三,在每個支援的帳號上啟用多因素驗證,並優先處理電子郵件、金融、雲端與系統管理者的存取。若可使用防網釣的 passkey,應優先選擇它們,而非共用密碼。

兩條維護規則補完整個工作流程。請在密碼重複使用、已在某次外洩通知中曝光、或您有理由懷疑遭到入侵時予以變更 — 而非依循與風險無關的固定週期日曆。蒐集這些密碼的服務業者本身也有其責任:應使用合適的加鹽密碼雜湊函數儲存,而非快速的 SHA 或可逆加密。對於想在特定平台上比較相同邏輯如何描述的讀者,Office 365 送出前在地稽核指南將相同的長度加模式架構套用於具體的服務情境。