一個完全在瀏覽器中執行的密碼產生器,是密碼產生器替代方案中安全性最高的選擇,因為密碼是在本地端從您裝置自身的隨機來源產生,從不傳輸、記錄或儲存在遠端伺服器上。基於瀏覽器的密碼管理工具、註冊表單產生器,以及獨立的隨機字串工具,都有一個共同的結構性限制:大多數依賴較弱的隨機性、透過網路往返同步密碼,或是要求登入帳戶才能使用。由平台 crypto.getRandomValues 驅動的本機產生器,透過將流程中的每個步驟都保留在裝置上(從隨機位元組的抽取到最終字元的選擇),避開了這些問題。您選擇長度和字元類型,工具產生字串,結果會一直留在瀏覽器分頁中,直到您複製它為止。關閉分頁會徹底丟棄該密碼。對於想要一個真正能信任來保護高價值帳戶的密碼產生器替代方案的人來說,這種純本機設計正是區分嚴謹工具與隨意工具的關鍵。

為什麼人們尋找密碼產生器替代方案
人們搜尋密碼產生器替代方案的原因有多種,且彼此重疊。有些人厭倦了內建於密碼管理工具和註冊頁面中的產生器,這些產生器可能速度緩慢、需要登入帳戶才能使用,或是綁定了他們寧可停用的同步功能。其他人則不信任那些悄悄將候選密碼上傳到伺服器後才在畫面上顯示的網路工具,或是那些使用 JavaScript 的 Math.random 來產生字串的工具——這個函式的輸出並非加密安全的,而且在許多情況下可以從少量先前的輸出被預測出來。許多讀者正在尋找一個可攜、不需帳戶的選項,可以在任何現代瀏覽器中使用,無需登入、安裝擴充功能,或在裝置間同步狀態。常見的主題是隱私:一個將產生步驟保留在裝置上、使用真正的隨機性,且從不要求個人資訊的密碼產生器替代方案,正是大多數讀者希望找到的工具類型。
安全本機產生器的內部結構:三個組成要素
一個值得信賴的密碼產生器替代方案由三個要素決定:隨機性的來源、如何從該隨機性中選取字元,以及產生的字串會如何處理。
隨機性來源。工具必須使用加密安全的 RNG。在瀏覽器中,這意味著使用平台內建的 crypto.getRandomValues,它由 Web Crypto API 公開,也是瀏覽器內部用於工作階段權杖和金鑰材料的同一個基礎。使用 Math.random 的產生器雖然快速但可預測:能夠觀察到少量先前輸出的攻擊者,通常可以重建內部狀態並重現每一個未來產生的字串。crypto.getRandomValues 的技術行為記錄在 MDN 的 Web Crypto API 參考頁面 上。
字元選擇。即使有良好的隨機性,以天真的方式將隨機整數透過模運算對應到字元集,會引入一個微妙的偏差。當字元集的大小無法整除底層的整數範圍時,某些字元被選中的機率會略高於其他字元,從而降低輸出的真實熵。正確的實作方式是使用拒絕抽樣(rejection sampling):會落在偏差餘數範圍內的隨機值會被丟棄並重新抽取,直到集合中的每個字元都以完全相等的機率被選中。
輸出處理。一個產生密碼但從不將其傳送出去的本機工具,在結構上就更加安全。產生的字串應該只存在於使用者正在查看的瀏覽器分頁中,並在分頁關閉的那一刻被丟棄。網路記錄、伺服器端儲存和剪貼簿回顯都會洩漏秘密;純本機的產生器可以同時避開這三種風險。
密碼產生器 滿足這三個條件。它每次抽取都使用 crypto.getRandomValues,以拒絕抽樣選取每個字元,確保啟用集合中的任何字元都不會被過度代表,而且從不以密碼作為資料發出網路請求。
如何在本地端產生強密碼
使用本機瀏覽器工具產生強密碼只需幾次點擊。下列步驟與密碼產生器上的控制項完全對應。
- 在瀏覽器中開啟工具。無需登入、安裝擴充功能或設定同步——這個頁面是自包含的,在首次載入後即可離線運作。
- 使用滑桿或數字框選擇長度。16 字元的密碼是合理的預設值;更長的密碼更安全,因為每增加一個字元,攻擊者必須進行的運算量就會倍增。
- 切換您要包含的字元類型:大寫字母、小寫字母、數字和符號。啟用全部四種類型可以最大化字元池大小和每個字元的熵。
- 決定是否排除容易混淆的字元,例如 0、O、1 和 l。這會犧牲少量熵,換來更容易閱讀和手動輸入的密碼——當您必須從螢幕上讀取一次密碼時,這個權衡是值得的。
- 查看輸出旁邊顯示的強度和熵估計值。它會告訴您密碼具有多少位元的熵,這是根據長度和當前啟用的字元池計算出來的。
- 點擊「複製」將結果傳送到您的剪貼簿,或點擊「產生新密碼」以相同的設定重新產生一個新的字串。將密碼貼到您要保護的帳戶的註冊或變更密碼表單中。
由於每個步驟都在您的瀏覽器中執行,密碼永遠不會被傳輸到伺服器。關閉分頁會將其從記憶體中丟棄,除非您明確將其儲存到密碼管理工具中,否則不會寫入磁碟。
熵、模偏差,以及為什麼長度勝出
隨機密碼的強度是以熵的位元數來衡量的,公式很簡單:熵等於密碼長度乘以字元池大小的以 2 為底的對數,字元池大小是指密碼可能從中抽取的不同字元數量。當大寫、小寫、數字和符號全部啟用時,字元池包含 86 個字元,因此每個字元大約為總熵貢獻 6.4 位元。從該字元池產生的 12 字元密碼大約具有 77 位元的熵,而 16 字元的密碼大約具有 103 位元的熵。一個合理的經驗法則是:低於 60 位元是弱的,60 到 100 位元是一般的,100 位元或以上對於離線暴力破解攻擊(攻擊者每秒可以測試數十億次猜測)則是強的。
以一個長度為例,讓公式更具體。當四種類型的字元全部啟用時,字元池大小為 86,因此 log2(86) 約為 6.43。對於 16 字元的密碼,熵等於 16 乘以 6.43,得出 102.9 位元——這個值工具會四捨五入到 103 位元。
長度在字元多樣性之上佔有主導地位,原因很簡單:增加字元會使熵隨新字元數量線性增加,而切換到更大的字元池只會改變對數因子。這就是為什麼一個長的 passphrase 可以擊敗一個較短但符號很多的字串,也解釋了為什麼 NIST SP 800-63B 和 OWASP 身分驗證備忘錄(Authentication Cheat Sheet) 的現代指引偏好長度和唯一性,而不是強制要求符號或數字等複雜度規則。
模偏差是一個會悄悄降低熵的細微缺陷。當產生器使用隨機整數模字元池大小來選取字元時,只要字元池大小無法整除底層的整數範圍,某些字元就會被略微更頻繁地選中。修正方法是拒絕抽樣:任何會落在偏差餘數範圍內的隨機值都會被丟棄並重新抽取,使得集合中的每個字元都以完全相等的機率被選中。結合 Fisher–Yates 洗牌演算法——它會隨機排列每個字元的位置,包括產生器保證從每種選定類型中包含的那些字元——最終字串將承載長度和字元池大小所暗示的完整熵。
內建產生器與本機產生器的比較
並非每個密碼產生器替代方案在內部結構上都相同。下表從四個決定所產生字串是否真正私密且不可預測的屬性,對最常見的做法進行對比。
| 產生器類型 | 隨機性來源 | 密碼是否上傳或儲存在遠端? | 無需帳戶即可使用? | 您應該知道的熵限制 |
|---|---|---|---|---|
| 使用 crypto.getRandomValues 的本機瀏覽器工具 | CSPRNG(平台的 Web Crypto API) | 否——保留在瀏覽器分頁中 | 是 | 僅受限於您設定的長度 |
| 密碼管理工具內建的產生器 | 管理工具的 CSPRNG(依產品而異) | 取決於管理工具的同步設定 | 否——鎖定在管理工具中 | 通常上限為 64–128 字元 |
| 網站上的註冊表單產生器 | 服務端 RNG | 通常會傳送到該服務的伺服器 | 是 | 通常上限為 16–20 字元 |
| 使用 Math.random 的隨意網路工具 | JavaScript Math.random | 有時會在伺服器端記錄 | 是 | 長度可能看起來很高,但實際熵遠低於字元數所暗示的值 |
使用所產生密碼的實用技巧
產生器只解決了建立步驟;其餘的工作流程才決定密碼是否能真正保護帳戶。養成幾個習慣會帶來明顯的差異。
- 為每個網站使用唯一的密碼。在多個服務中重複使用同一個強密碼,會使一次外洩變成多次外洩。一個能儲存所產生字串的密碼管理工具,是在不必記住數十個隨機字元的情況下處理唯一性的實用方法。
- 在重要的帳戶上使用 16 字元或更長的密碼。電子郵件、銀行、主要雲端儲存和密碼管理工具的主密碼,都值得使用工具能產生的最長字串。價值較低的帳戶可以使用 12 字元,仍然超過 60 位元的底線。
- 除非網站要求,否則跳過強制複雜度規則。OWASP 和 NIST 的指引建議接受僅由小寫單字組成的長 passphrase,因為長度對熵的貢獻大於符號。
- 複製、貼上,然後關閉。最安全的做法是:產生、複製、貼到表單中,然後關閉分頁。瀏覽器分頁只在開啟期間將密碼保留在記憶體中;一旦關閉,該秘密就會從裝置上消失,除非它已經被儲存在其他地方。
- 只有在必須手動讀取密碼時才排除容易混淆的字元。如果密碼完全由管理工具管理,則保留它們以獲得額外的熵。如果您需要在電話中口述密碼或從便條上讀取它,這個權衡是值得的。
當密碼產生器替代方案仍不足時
本地的密碼學安全產生器能填補建立密碼的缺口,但無法涵蓋所有威脅。當使用者在錯誤的網域上輸入密碼時,釣魚網頁仍能截取再怎麼隨機的密碼。裝置上的惡意軟體可以在複製動作之後讀取剪貼簿內容。同步至已被入侵雲端帳戶的密碼管理程式,可能會洩漏儲存的密碼,即使每一組密碼都是正確產生的。對於高價值的帳戶來說,雙因素驗證仍然是最可靠的防護,因為即使攻擊者取得了密碼本身,雙因素驗證還需要他們所沒有的東西。務實的結論是,把產生器視為整體安全架構中的一層,而不是完全取代它的方案。
如需更深入的說明,請參閱 在 Linux 上以本地稽核檢查密碼複雜度。
如需更深入的說明,請參閱 在 Mac 上進行 Base100 編碼:無需安裝即可在 Safari 中執行。