
1Password 如何產生密碼(以及為何本地工具能派上用場)
密碼產生器會從你選擇的字元集中,透過完全在瀏覽器內執行的密碼學安全亂數產生器(CSPRNG)來建立一組隨機密碼,且輸出結果永遠不會傳送到伺服器。若要在 1Password 中使用,請開啟密碼產生器,選擇長度為 16 以上,啟用大寫、小寫、數字與符號,並可選擇性地排除像 0、O、1 和 l 等容易混淆的字元,按下「產生」,然後將結果複製到新增或現有的 1Password 項目中。每個字元都是從瀏覽器內建的 crypto.getRandomValues API 取得,該 API 被設計為無法預測,這與 JavaScript 的 Math.random 不同,因為後者的輸出可以從先前的值被推算模型。產生器還使用拒絕抽樣(rejection sampling)來消除模偏差(modulo bias),確保至少包含你所選每種類型的一個字元,並透過 Fisher–Yates 演算法打亂結果,確保那些被保證出現的字元不會被固定在特定位置。強度以熵位元數(bits of entropy)表示,計算公式為 length × log2(poolSize),因此你可以一眼判斷即將複製到 1Password 的密碼是否達到實用的門檻。
1Password 本身內建了產生器,會在你建立或更新登入資料時自動啟用,因此大多數使用者從未需要其他工具。獨立的本地瀏覽器工具的價值在於透明度與掌控權:你可以看到熵數值、精確選擇池大小、排除容易混淆的字型,並且無需先登入密碼管理工具,就能在任何裝置上重複使用相同的程序。兩種方法都基於相同的密碼學原理,因此選擇差異只在於你希望這項工作在哪裡執行。
逐步產生一組高強度密碼
- 在瀏覽器分頁中開啟密碼產生器。
- 拖動長度滑桿,或在數字方塊中輸入,直到顯示為 16 以上。長度是影響熵的最大單一變數,從完整字元池中取 16 個字元大約可得到 103 位元。
- 勾選大寫字母、小寫字母、數字和符號的方塊,使池中包含 86 個相異字元。
- 如果你打算將密碼手動抄寫到備忘表上,請開啟「排除容易混淆的字元」以移除 0、O、1 和 l。這會犧牲少量熵,但換來更易於辨識。
- 查看輸出結果下方的熵數值。對於任何涉及財務資料、電子郵件或管理員權限的帳號,目標應設定在 100 位元以上。
- 按下「產生新密碼」。如果第一組字串不合你意,再按一次;每次按下都會重新擲出全新的亂數。
- 按下「複製」,然後立刻切到 1Password,將該值貼到新項目或你正在更新的現有登入項目的密碼欄位中。
- 儲存項目後,關閉或重新整理瀏覽器分頁。由於產生過程是在本地進行,關閉分頁就會從記憶體中捨棄該密碼,且永遠不會被寫入任何伺服器記錄。
理解熵與長度
熵以位元(bits)為單位測量,是比較密碼時最實用的單一數字,因為它能估計攻擊者平均需要嘗試多少次猜測才能命中你的密碼。你每增加一個字元,搜尋空間就會乘以池的大小,因此公式很直觀:entropy = length × log2(poolSize)。在啟用全部四組字元集的情況下,池的大小為 86 個字元,log2(86) 約為 6.426,因此每個字元大約貢獻 6.4 位元。
計算範例:從完整池中取出的 16 字元密碼,其熵為 16 × 6.426,等於約 103 位元。這個數值在面對離線暴力破解攻擊時,穩穩落在「強」的範圍內。
| 長度 | 熵(位元) | 強度區段 |
|---|---|---|
| 12 | ~77 | 中等 |
| 16 | ~103 | 強 |
| 20 | ~129 | 強 |
| 24 | ~154 | 強 |
經驗法則是:低於 60 位元對認真的攻擊者而言偏弱,60 到 100 位元屬於中等,而 100 位元以上為強。長度永遠是關鍵:長度加倍,熵也加倍;而從僅含小寫字母改為混合大小寫,每個字元僅增加約 1.7 位元的固定倍數。
一個微妙但真實存在的細節是模偏差(modulo bias)。如果產生器透過將原始亂數除以字元集大小取餘數的方式來對應到字元集,那麼當字元集大小無法整除亂數範圍時,某些字元被選中的機率會略高一些。這種微小的不平衡會從輸出中削去真實的熵,並使密碼更易於預測。密碼產生器透過丟棄落在偏差餘數區段內的亂數並重新抽取來避免這個問題,因此每個字元都是以完全相同的機率被選出。接著,它使用 Fisher–Yates 演算法打亂整個結果,以確保每組中保證出現的字元不會被固定在特定位置,讓攻擊者無法利用該模式。
比較本地產生器與 1Password 內建功能
兩種方式都會產生密碼學上隨機的密碼;差別在於工作執行的位置,以及過程中你能看見多少細節。
| 面向 | 1Password 內建產生器 | 本地瀏覽器密碼產生器 |
|---|---|---|
| 產生程序執行位置 | 在 1Password 應用程式或瀏覽器擴充功能內 | 在你的瀏覽器分頁內 |
| 網路使用 | 產生步驟本身不使用網路 | 頁面載入後不使用網路 |
| 亂數來源 | 應用程式自有的 CSPRNG | 瀏覽器的 crypto.getRandomValues |
| 長度與字元控制 | 可在應用程式設定中配置 | 介面中的滑桿與勾選方塊 |
| 熵值顯示 | 不一定會顯示 | 以位元形式顯示在輸出下方 |
| 是否需要帳號 | 需要,目前有效的 1Password 訂閱 | 不需要帳號 |
| 密碼儲存 | 在你確認項目後儲存至保險庫 | 僅存在於瀏覽器分頁中,直到你關閉它 |
如果你已經在 1Password 內並需要一組新的登入資料,內建工具是最流暢的路徑,因為它會在產生密碼時直接寫入項目中。本地瀏覽器產生器較適合用於以下情況:你想在註冊 1Password 之前就取得密碼、需要查看熵值、想批次產生一整批憑證,或只是單純偏好檢查字串的實際構成方式。兩者都依賴相同的底層概念——CSPRNG 加上無偏差的字元選擇——因此輸出品質相當。
將產生的密碼儲存到你的保險庫
一旦密碼產生器給你一組字串,在 1Password 內的工作流程很短。開啟 1Password 並建立新項目,或編輯現有的登入資料。點入密碼欄位,貼上你從產生器複製的值,讓 1Password 提示你確認強度——任何高於 100 位元的密碼都會被判定為強。儲存項目後,關閉產生密碼的瀏覽器分頁,讓該字串不再留在瀏覽器記憶體中。
兩個習慣會帶來很大的差別。第一,永不要在不同網站間重複使用產生的密碼;唯一性正是防止單一服務的洩密擴散到你存在 1Password 中其他帳號的關鍵。第二,不要把產生的密碼在送入保險庫的途中貼到筆記應用程式、聊天視窗或電子郵件草稿中——請直接貼到密碼欄位,這樣該字串就不會在管理工具之外的明文儲存中出現。
來自 OWASP 身分驗證速查表 與 NIST SP 800-63B 的現代指引都傾向於採用存放在管理工具中的長、隨機且唯一的密碼,這正是密碼產生器加上 1Password 所產出的模式。如果你想要一個完全不依賴任何擴充功能的平行工作流程,可以參考指南 在 Chrome 本地產生高強度密碼(不進行同步),它使用 Chrome 內建工具走過相同的 CSPRNG 方法。由於產生過程是在本地進行,你的密碼永遠不會透過網路傳送、寫入伺服器記錄或儲存在任何地方;它僅存在於你的瀏覽器分頁中,直到你複製它,而關閉分頁就會將其捨棄。