密碼產生器

密碼學安全 // v1.0

設定

範圍:4-64

範圍:1-10

字元集
輸出緩衝

等待輸入...

什麼是隨機密碼產生器?

隨機密碼產生器會從你允許的字元集中均勻隨機抽字元,組出一組密碼。RandomHub 用瀏覽器原生的 Web Crypto API(window.crypto.getRandomValues)配合拒絕採樣(rejection sampling)避開模數偏差 — 這是主流密碼管理器採用的同一條亂數源,沒有 Math.random 出現在任何環節。長度(4 到 64 字)、要啟用哪些字元集(大寫、小寫、數字、符號)、要不要排除視覺上容易混淆的字元(l, 1, I, O, 0),全部由你決定。產生過程是 client-side 的 JavaScript,按下產生鈕時頁面不會發出任何網路請求;DevTools 的 Network 分頁打開來,會看到一片乾淨。整段流程不會被記錄、不會被上傳、也不會被任何方式分析。

這個工具是給誰用的?

🔐

注重隱私的使用者

帳密自己管,希望用一個能驗證的、跑在 client 端的產生器,而不是某個廠商的「相信我們,沒事」黑盒。

🛠️

IT 與系統管理員

建立服務帳號、SSH 金鑰的 passphrase、資料庫 seed、發給新人的一次性帳密。64 字元上限基本可以涵蓋幾乎所有非「滿熵金鑰」的情境。

👨‍💻

開發者

開發環境的拋棄式 secret、test fixtures、模擬登入流程、範例資料 — 開個瀏覽器分頁比叫 `pwgen` 或 `openssl rand` 更順手的時候。

👨‍👩‍👧

家長

幫從沒記過強密碼的小孩開帳號。把容易混淆的字元排除掉,密碼就能讀出來給孩子打,不會卡在「這個是 0 還是 O」。

🧰

Self-host 玩家

自架 Vaultwarden、Nextcloud、Postgres 或管理面板的時候,密碼管理器還沒接好就要新帳密。產生 → 貼上 → 繼續架。

🧑‍💼

當管理器自帶的產生器卡住時

某些密碼管理器把產生器藏在選單裡或瀏覽器擴充功能裡,偏偏在你要註冊的當下不能用。一個獨立可信的工具剛好解掉那一瞬間的摩擦。

為什麼用這個密碼產生器

01

密碼學等級的亂數源

bytes 是從 window.crypto.getRandomValues 拿的 — 跟 1Password、Bitwarden、現代瀏覽器自己的產生器同一條 Web Crypto API。整條管線不出現任何 Math.random。

02

不會有模數偏差

直接 `random % poolSize` 在池大小無法整除亂數源時,低位 index 會被微微偏向出現。我們對 Uint32 用拒絕採樣,把不平衡的尾巴丟掉重抽,每個字元保持等機率。

03

用真正的位元數量化強度

熵 = 長度 × log₂(池大小),課本公式。分級:弱 <40 位元、一般 40–63、強 64–95、堡壘級 96+。眼睛立刻就能看到設定有沒有打到目標。

04

從頭到尾在瀏覽器裡

產生密碼時不會發任何網路請求。不寫 log、不存、不傳、不分析。打開 DevTools、按下產生 — Network 分頁會一直靜悄悄。

常見場景與範例

為銀行帳號開新密碼

註冊銀行或政府服務,但對方不收符號。長度 20、啟用大寫/小寫/數字、關掉符號、排除混淆字元 — 列印的單據上也能讀。

設定:長度 20、大寫+小寫+數字、排除混淆字元。範例:「Tyek5JWXcbgjLE2EH3vk」 — 20 × log₂(58) ≈ 117 位元,穩穩落在堡壘級,純英數字符合需求。

SSH 金鑰的 passphrase

私鑰需要一條每天打一次、能憑記憶輸入的 passphrase。長度 24、全部字元集、不排除混淆 — 高熵又可讀。輸進密碼管理器之後,就可以不用再背了。

設定:長度 24、全部字元集、排除混淆字元關閉。範例:「K9$mZ#7vTq!4nL@8pR2&yX#W」 — 24 × log₂(76) ≈ 150 位元,遠遠強過它要保護的金鑰。

拋棄式測試帳號

開發過程要開個一小時就會刪掉的測試帳號。長度 12、小寫 + 數字就夠用。

設定:長度 12、只勾小寫+數字。範例:「k7vmqr3z9fnp」 — 12 × log₂(36) ≈ 62 位元。落在「一般」,給一小時用的拋棄帳號剛剛好。

需要念出來給人輸入的共用密碼

一個人念、另一個人打的場景。把混淆字元(小寫 l、大寫 I、數字 1、大寫 O、數字 0)排除掉 — 最常見的轉抄錯誤幾乎全部消失。

設定:長度 16、大寫+小寫+數字、排除混淆字元啟用。範例:「RvkP4hgWmFu82tNz」 — 16 × log₂(58) ≈ 94 位元,幾乎到堡壘級,吵雜環境裡也能聽清楚。

怎麼用

  1. 1.

    設定長度

    4 到 64。一般帳號 16 是不錯的預設;SSH passphrase 或自架 root 帳號建議 24 以上。

  2. 2.

    挑字元集

    大寫、小寫、數字、符號的開關。每多開一組字元集,池就更大,每個字元帶的熵也就更多。結果保證每個有勾的字元集都至少有一個字元出現。

  3. 3.

    處理混淆字元

    關閉(預設):l, 1, I, O, 0 留在池裡 — 多一點熵。打開:濾掉 — 唸出來、抄下來都更不易出錯。

  4. 4.

    產生再複製

    按產生鍵,或者 Enter。每組密碼都有自己的複製鈕;「全部複製」對應一次產 1 到 10 組的情境。公開場合可以用「顯示/隱藏」防止被旁人看到。

常見問題

這個密碼產生器真的安全嗎?

亂數來自 window.crypto.getRandomValues — Web Crypto API,跟 1Password、Bitwarden、現代瀏覽器自己的產生器是同一條。再用拒絕採樣避開模數偏差。生成完全在 client 端:開 DevTools 按一下產生,會看到沒有任何網路流量。

什麼是「模數偏差」,為什麼要在意?

直觀做法是先抽一個 32 位元亂數,再 `n % poolSize`。當池大小無法整除 2³² 的時候,某些位置會比其他位置稍微更容易出現。對密碼來說這就是一點點熵的洩漏。我們把落在不平衡尾段的樣本丟掉重抽,讓每個字元保持等機率。

位元強度是怎麼算出來的?

熵 = 長度 × log₂(池大小)。16 字、只用小寫+數字:16 × log₂(36) ≈ 83 位元。同樣 16 字、四組字元集都開、不過濾混淆字元:16 × log₂(94) ≈ 105 位元。分級門檻:弱 <40、一般 40–63、強 64–95、堡壘級 96+。

為什麼要排除混淆字元?

l, 1, I, O, 0 在很多字型裡長得太像。如果這個密碼會被讀出來、抄到紙上、用電話念給別人、或顯示在 kiosk 螢幕上,把它們濾掉很有用。代價是池稍微變小,每個字元的熵也跟著少一點點 — 大多數情境下這個交換很划算。

密碼會不會被存下或傳出去?

不會。產生過程是瀏覽器裡的 JavaScript。按下產生時頁面不會發任何 request,沒有 log、沒有儲存、沒有傳輸、沒有任何分析。即使你之後要求我們找出某組產生過的密碼,我們也找不出來 — 根本沒留下來。

為什麼最低長度是 4 不是 8?

一般帳號當然應該 12 以上。留 4 是因為有合理的「PIN 風格」用途(門禁碼、App PIN、課堂遊戲等)需要短的純數字或字母字串。當熵太低時,強度指示器會直接警告。

勾「符號」的時候會包含哪些符號?

字元集是 `!@#$%^&*()-_=+[]{};:,.<>?/`,共 26 個。我們刻意不收容易讓表單驗證壞掉的字元(反斜線、單引號、雙引號、反引號、空白),這樣產生的密碼能在比較多的註冊表單上都能用。

能不能產生「correct horse battery staple」這種片語密碼?

目前不行 — RandomHub 是字元級的密碼產生器。Diceware 風格的片語需要精挑的字典,是另一個工具。如果這需求值得,會以獨立頁面的方式提供。

關於高強度隨機密碼

密碼對抗暴力破解的強度,跟它的位元熵呈指數關係成長。從 94 個可列印 ASCII 字元中抽出 12 個字元,大約是 79 位元 — 只要 hash 經過合理的 stretching,這已經超過離線攻擊者用合理硬體預算能破解的範圍。16 字大概 105 位元,24 字大概 158 位元,已經遠超過 AES-128 的實用安全等級。最近十年密碼研究的結論很清楚:長度比字元類別的多樣性更有效。一個 10 字密碼加一個符號的收益,比起把同樣的密碼從一個比較小的字元集擴展到 14 字,要小得多。RandomHub 的預設值 — 長度 16、四組字元集全開、不過濾混淆字元 — 對絕大多數威脅模型來說,已經舒服地落在堡壘級。這個工具刻意保持窄:密碼學等級的亂數、可調的長度與字元集、一個誠實的熵指示器 — 別的不做。如果有功能能明顯改善流程、又不破壞「東西不離開瀏覽器」這條保證,寫信給我們。