安全指南
為什麼 Math.random 不適合用於密碼
了解為什麼 Math.random 適合 UI 效果,但不適合用於密碼、重設碼、令牌或其他安全敏感的秘密。
摘要
Math.random() 是一個通用的 JavaScript 偽隨機函式。它適用於動畫、隨機化 UI 行為、範例、遊戲和模擬。它並非為加密安全而設計,不應用於生成密碼、重設碼、API 秘密、簽署金鑰或復原令牌。
問題
密碼產生器需要對攻擊者具有不可預測性,而不僅僅是對使用者看起來多樣化的值。Math.random() 不提供瀏覽器標準的加密安全保證,且不同引擎的實作可能有所差異。
更安全的瀏覽器選項
現代瀏覽器透過 Web Crypto API 提供 crypto.getRandomValues()。PwdGen 使用該介面並採用拒絕取樣,以避免字元選擇偏差。如果該 API 不可用,安全的行為是停止生成並解釋相容性需求。
如何審查一個產生器
在原始碼中搜尋 Math.random。一個嚴謹的密碼產生器不應將其用於密碼字元。它可能出現在說明文件中解釋為何不安全,但不會出現在生成路徑中。
詳細指引
本指南重點說明為什麼 Math.random 不適合用於密碼和秘密。它為開發者、學生和工具使用者而寫,用於檢查產生器是否使用安全的隨機性,因此實際目標並非製造戲劇性的安全宣稱。目標是選擇一個能在日常使用中存活的密碼習慣:登入表單、密碼管理器、行動鍵盤、帳戶復原、共用裝置,以及偶爾遇到有奇怪驗證規則的服務。只有當真實的人能夠一致地遵循時,安全的建議才有用。
最安全的起點是隨機性加上唯一性。隨機性意味著該值是從一個大空間中由加密安全的隨機源選出,而不是從生日、寵物名、鍵盤模式或喜愛的名言中發明。唯一性意味著同一個密碼不在其他地方使用。一個長但重複使用的密碼可能在一次無關的洩漏後迅速失效,而一個唯一隨機的密碼將損害限制在使用它的單一帳戶。
針對這個主題,一個實用的預設是使用 crypto.getRandomValues 搭配拒絕取樣,而不是 Math.random。您可以透過 Web Crypto API 指南 應用此預設,然後將最終值儲存在可信的密碼管理器中。PwdGen 在瀏覽器中本地使用 Web Crypto 生成值;生成的密碼不會發送到 PwdGen 伺服器。這種本地設計減少了伺服器端的暴露,但無法防範所有威脅。惡意的瀏覽器擴充功能、受感染的裝置、釣魚頁面或不安全的剪貼簿處理仍可能在生成後暴露秘密。
最常見需要避免的問題包括可預測的偽隨機序列、模數偏差、自訂隨機函式以及複製到生產環境的示範程式碼。這些問題之所以重要,是因為攻擊者很少需要暴力破解所有可能的密碼,當人類習慣給了他們捷徑時。憑證填充、釣魚、洩漏的密碼列表和帳戶復原濫用通常比純數學搜尋更實際。這就是為什麼最佳建議結合密碼品質與帳戶層級控制,例如 MFA、通行金鑰、復原碼儲存,以及定期檢視復原電子郵件或電話設定。
在應用建議時,請使用此檢查清單:
- 不要將 Math.random 用於密碼。
- 在瀏覽器中使用 Web Crypto。
- 在 CLI 程式碼中使用 Node crypto 或經過審核的套件。
- 測試是否有意外的降級程式碼。
如果網站拒絕理想的設定,不要手動將密碼強制改為較弱的模式。一次調整一個變數。如果符號被拒絕,保留大寫、小寫和數字,並增加長度。如果最大長度很短,使用允許的最大長度並確保該值是唯一的。如果密碼必須大聲朗讀、列印或在電視或路由器螢幕上輸入,考慮排除容易混淆的字元,並增加長度以補償較小的字母表。
最後,記住密碼建議的邊界。一個強密碼是一層防禦,而不是保證。它無法讓釣魚頁面安全、修復惡意軟體,或補償一個儲存憑證不當的服務。有用的習慣是無聊但持久:生成一個唯一值,安全儲存,保護復原路徑,並在懷疑暴露時迅速更換。
安全的下一步
閱讀本指南後,做一個小型的帳戶審計,而不是試圖一次修復所有問題。選擇一個如果被接管會造成最大麻煩的帳戶,確認其密碼是唯一的,並檢查復原電子郵件、復原電話、MFA 方法和備份碼儲存。如果該鏈條的任何部分薄弱,在轉向低風險帳戶之前先改善該部分。這個順序讓工作可管理,並保護攻擊者最可能用作跳板的帳戶。關於為什麼 math.random 不適合用於密碼,最好的結果是一個可重複的習慣:本地生成,小心儲存,避免重複使用。
常見問題
Math.random 什麼時候可以用?
可以,用於視覺效果、模擬和一般 UI 隨機性,但不用於憑證或安全令牌。
密碼產生器應該用什麼替代?
應該使用加密隨機源,例如瀏覽器中的 crypto.getRandomValues()。
PwdGen 會降級使用 Math.random 嗎?
不會。如果 Web Crypto 不可用,PwdGen 會顯示相容性警告,並且不會使用 Math.random() 生成密碼。