在 JavaScript 中檢查密碼長度最直接的方式,是使用內建的 .length 屬性,它會回傳字串中 UTF-16 字碼單位的數量 — 因此像 "Hunter2!" 這種純 ASCII 密碼會回報 8,但像 "😀" 這種表情符號會被計為 2,因為它位於輔助平面。對於使用者自行設定的密碼,現行 NIST 指引認為,當密碼是唯一的身份驗證因素時,任何短於 15 個字元的密碼都屬於強度不足,這代表簡單的 if (password.length >= 8) 檢查在現代標準下過於寬鬆。如果想在不撰寫完整驗證器的情況下,取得透明且符合 NIST 標準的長度、字元多樣性與明顯模式的審查結果,可以將該值送入 Password Strength Checker,它會計算 Unicode 字碼點(因此表情符號算作一個)、套用已公布的長度區間,並標記重複或連續的片段 — 而且全程都在你的瀏覽器中執行。你所看到的標籤僅是回饋,而非認證,因此請務必搭配密碼管理工具、服務業者的封鎖清單檢查,以及多因素驗證一起使用。

check password length in javascript
在 JavaScript 中檢查密碼長度:程式碼與本機稽核

為什麼密碼長度是首要衡量指標

長度是與抵抗線上猜測攻擊能力關聯性最強的單一屬性,出自 NIST SP 800-63B。密碼越長,攻擊者需要測試的候選項目就越多,基於外洩資料庫的查找成本也會提高。大多數現代政策文件都趨向於:為了相容舊有系統,最低長度為 8 個字元;而當密碼單獨使用時,建議目標為 15 個字元以上。一個混合大小寫、數字與符號的短密碼,仍然比一長串字典詞組的密碼更容易被猜中,因為攻擊者在嘗試所有字元排列組合之前,會優先使用常見替換、外洩詞組,以及特定服務相關的字詞。

針對 JavaScript 的實務而言,這代表長度檢查必須對應到目標服務實際接受的值。如果你的應用程式會去除空白字元、統一 Unicode 編碼,或拒絕特定字元類別,那麼你在用戶端測得的位元組數,可能與伺服器實際儲存的內容不符,因此它只是一個參考指標,而非保證。當你需要與真實驗證器相符的回饋時,本機的 Password Strength Checker 套用了相同的 NIST 對齊長度區間,並加入透明的模式標記,這讓它在把密碼送交註冊頁面前,成為一個有用的第二意見來源。

JavaScript 內建方式:.length、字碼單位與字碼點

最便宜的檢查方式是 password.length。但要注意的是,「一個」究竟代表什麼:

  • 對於 ASCII 字元,password.length 就是字元數。
  • 對於 U+FFFF 以上的 BMP 字元(大多數表情符號及許多 CJK 字碼點),每個字元都是一對 UTF-16 代理對,因此會被計為 2。
  • 組合記號與 ZWJ 序列可能產生與人類閱讀字串方式不一致的計數結果。

以下範例是 JavaScript 中用於最小長度檢查的標準寫法:

function isValidLength(password) {   return password.length >= 8; }

如果你需要將表情符號視為一個單位的 Unicode 感知計數,可以將字串展開為字碼點陣列:

function codePointLength(str) {   return [...str].length; }

呼叫 "😀password".length 會回傳 10,因為該表情符號是一對代理對;而 [..."😀password"].length 則會回傳 9,因為該表情符號是一個字碼點。如需結合長度、空值處理與模式檢查的更完整用戶端驗證器,且無需伺服器往返,請參考 Check Password Strength in JavaScript Without a Server 指南。

如何使用 Password Strength Checker 進行長度與模式檢視

Password Strength Checker 是一個本機工具,它採用相同的長度邏輯,並加入透明的模式檢查。當你想在把候選密碼送交實際註冊表單,或交給密碼管理工具之前,快速取得第二意見時,可以使用它。

  1. 將候選密碼輸入或貼到輸入欄位;在按下 Show 之前,內容都會保留在本機且隱藏不顯示。
  2. 檢視回報的長度、描述性的字元群組計數(小寫、大寫、數字、符號、空白字元、非 ASCII),以及工具所產生的模式標記與各項建議。
  3. 套用工具的指引:優先採用由密碼管理工具產生的唯一值,或一個又長又獨特的詞組;確認目標服務接受這些字元;將完整值與服務的封鎖清單進行比對;並在帳號上啟用 MFA。

你所看到的分數來自一組公開的文件化規則,而非公開的私有模型,因此你可以清楚了解某個值為何被限制上限或被接受。由於稽核在你的瀏覽器中執行,內容不會被上傳、儲存,或與遠端外洩資料庫比對。

分數區間的真正意涵

此檢查器使用已公布的長度區間,並與 NIST 對齊的回饋一致:

以字碼點計算的長度 無模式 含有模式
空 弱 (0) 弱
1 至 7 弱 弱
8 至 14 普通 上限為普通
15 至 19 良好 上限為普通
20 以上 極佳 上限為普通

在閱讀此表格時,有幾個細節值得注意:

  • 長度是以 Unicode 字碼點計算,因此一個含表情符號的 15 字元詞組會被視為 15,即使 JavaScript 的 .length 會顯示 16 或 17。
  • 字元群組計數僅供描述參考。工具並不要求一定要有大寫、數字或符號,因為強制的組成規則往往會產生可預測的替換,無法取代長度或封鎖清單檢查的作用。
  • 模式檢查刻意設定得較為狹窄。它會標記重複至少三次的 1 至 4 個字碼點片段,或是依序遞增或遞減 1 的四個字碼點序列(例如 "1234" 或 "dcba")。它無法辨識名言、歌詞、人名、日期、鍵盤走勢或外洩資料中的項目。

工具無法偵測的限制

「極佳」標籤是針對已文件化的本機檢查結果所提供的回饋,而非安全認證。Password Strength Checker:

  • 不會下載或查詢外洩資料庫,因此無法判斷該值是否已經外洩。
  • 無法偵測所有攻擊者可能優先嘗試的鍵盤走勢、語言字典詞彙或個人相關資料。
  • 不會以位元估算熵值,也不會預測破解時間。NIST 明確指出,使用者自選密碼的熵難以衡量,因此此工具刻意避免宣稱任何保證。

關於外洩情形,請依賴服務業者的通知,以及在有提供時使用密碼管理工具的「密碼已遭外洩」警示。在伺服器端的儲存方面,請遵循 OWASP Authentication Cheat Sheet,並使用合適的加鹽密碼雜湊函式,例如 Argon2id 或 bcrypt — 不要使用純 SHA 或可逆加密。

將長度、管理工具與 MFA 結合運用

長度是必要條件,但並非充分條件。單一帳號的完整防護樣貌如下:

  1. 使用 Password Generator 產生 15 個字元以上、唯一且隨機的值,或自行組合一個能記住的長詞組。
  2. 使用 Password Strength Checker 在本機驗證長度與明顯模式。
  3. 將該值儲存在密碼管理工具中,以免需要記住它。
  4. 確認服務業者接受你所產生的確切字元組合。
  5. 在電子郵件、金融、雲端與管理員帳號上,至少啟用 MFA — 可採用防網釣的 passkey 或 TOTP 碼。
  6. 在密碼重複使用、外洩或疑似遭到外洩時予以更換,而非依固定週期更換。

長度是密碼安全性的基礎門檻。JavaScript 的 .length 提供最快速的讀取,展開為字碼點能給出 Unicode 正確的讀數,而 Password Strength Checker 提供透明且符合 NIST 的稽核 — 將其結果作為挑選更佳密碼的參考,再以 MFA 為帳號上鎖。

若想深入了解,請參閱 Generate a SHA-512 Password Hash the Right Way。