繁體中文

文字與日常工具·密碼產生器

crypto.getRandomValues 與 Math.random:為什麼它對密碼很重要

· 工作原理

密碼 網路加密 隨機性

弱隨機路徑結束,而 Web 加密路徑繼續為密碼符號
原始 ToolAcre 向量圖

解釋瀏覽器的通用隨機數產生器與其加密隨機數產生器之間的區別,為什麼可預測性對於密碼來說是致命的,以及如何判斷使用哪個工具。

對於骰子遊戲來說足夠隨機,而不是密碼 - 瀏覽器提供的兩種隨機性

瀏覽器可以提供多個看起來不規則的值來源,但視覺障礙並不能證明序列適合憑證。 ToolAcre 繪製了一個硬產品邊界:每個單字選擇、分隔符號選擇、字元選擇和隨機交換都透過 `crypto.getRandomValues` 支援的一個安全整數函數。如果無法使用該 API,該頁面將停用產生,而不是產生看起來合理的替代品。

這種拒絕比兩個樣本輸出是否同樣混亂更重要。可預測的來源仍然可以列印看起來令人信服的字母、數字和單字。因此,該實施使源可審計且故障可見。它並不聲稱任何產生的值對於每個環境都是安全的;受損的瀏覽器或裝置仍然可以讀取頁面顯示的內容。

Math.random 的用途 — 快速、種子偽隨機性,其輸出可以透過一些觀察來重建

此工作簿將 Math.random 描述為可根據一些觀察結果重建的種子偽隨機性,但這些是此儲存庫並未為每個 JavaScript 引擎建立的一般實作宣告。對於該產品來說,本地事實更簡單、更強大:生產產生器檔案不會呼叫 `Math.random`。原始碼級測試會刪除註解、掃描可執行程式碼,如果此類呼叫出現在引擎或密碼應用程式中的任何位置,則會失敗。

這種差異使本文無法將實作規則變成通用的瀏覽器歷史講座。 ToolAcre 不需要表徵每種可能的 Math.random 演演算法來拒絕用於密碼產生的 API。它的套件接受 Web Crypto 或測試使用的注入安全源,並不公開種子、確定性模式或弱回退的生產選項。

這個儲存庫證明了 Math.random 的內容:它在生產產生中不存在

`createWebCryptoSource` 尋找可呼叫的 `getRandomValues`,然後將此方法包裝為套件隨機來源。應用程式在啟用控制項之前執行額外的探測:它要求全域加密物件在 try 區塊內填入單一元素類型陣列。這捕捉了屬性存在但在使用時拋出的受限環境,而不是信任膚淺的功能檢查。

來源在瀏覽器 API 邊界處停止。它不能證明哪個作業系統池、硬體指令或重新播種設計位於特定瀏覽器之下。這些細節在介面下方有所不同,並需要平台檔案。該程式碼確實證明了位元組是透過指定的 Web Crypto 方法到達的,並當探測失敗時不會嘗試產生。

crypto.getRandomValues 在這裡做什麼:透過瀏覽器 API 填入類型化數組

可預測性是危險的,因為憑證產生器應該做出觀察者無法從早期輸出重現的新選擇。 ToolAcre 透過拒絕確定性生產路徑、集中每次繪製並測試是否存在弱 API 來支援這一目標。它不承諾免受螢幕擷取、擴充、惡意軟體、網路釣魚、密碼重複使用或提交後錯誤處理憑證的服務的影響。

此邊界可以防止常見的類別錯誤:產生解決如何選擇候選者的問題,而不是隨後發生的所有事情。該包傳回一個字串,並不記錄或儲存它。該頁面在記憶體中保存一個當前值並將其呈現為文字。密碼儲存、傳輸、帳戶復原和驗證策略仍然由其他系統負責。

閱讀程式碼 — 如何檢查頁面使用哪個 API,以及為什麼開放、可檢查的頁面更容易信任

讀取程式碼從 `packages/password-generator/src/index.js` 開始,其合約規定每個隨機決策都會達到 `secureRandomInt`。然後,實作檔案顯示 `getRandomValues`、拒絕採樣和明確錯誤。最後,`no-math-random.test.js` 和更廣泛的密碼安全套件使否定保證可執行,而不是將「我們從不使用 Math.random」作為未經測試的註解。

開源本身並不能使程式碼正確,但它為審閱者提供了具體的檢查接縫。搜尋隨機來源,追蹤呼叫者進行選擇和隨機播放,並檢查 API 缺失時會發生什麼情況。值得信賴的評論應該能夠指出成功路徑和拒絕路徑,而不是從品牌推斷安全性。

工作範例 - 相同的單字挑選程式以兩種方式編寫,以及攻擊者可以用每種方式做什麼

考慮對低於 100 的整數的請求。 `secureRandomInt` 需要一個位元組,其範圍包含 256 值。它只接受可被 100 整除的最大前綴,該前綴在 200 之前結束,並拒絕剩餘的尾部。確定性測試提供位元組 200,後面接著位元組 7。此實作丟棄 200 並傳回 7;直接取模捷徑將從被拒絕的位元組中傳回零。

相同的安全整數函數為單字和字元選擇索引,因此這個範例不是一個脫離產生的玩具。生產中的確切位元組不是可重複的範例,並永遠不應作為憑證發布。有用的工件是控制流程證明:Web Crypto 填充緩衝區,拒絕不均勻的尾部,並只有接受的值才成為有界選擇。

工作範例:透過附帶的 secureRandomInt 路徑追蹤一次有界繪製

此儲存庫不實作或比較伺服器端產生器、硬體隨機數產生器或作業系統命令列工具。它也無法透過 JavaScript 稽核瀏覽器加密實現的內部結構。這些主題需要自己的來源材料、威脅模型和操作檢查,而不是貼在 ToolAcre 程式碼路徑上的類比。

該頁面也不是密碼管理器。它不會保存、同步、傳輸或自動填充其產生的內容。讀者不應將「加密隨機來源」解釋為重複使用結果或透過不安全通道移動結果的建議。此宣告僅屬於目前瀏覽器標籤內的選擇。

重點 — 密碼產生器使用瀏覽器的加密隨機數產生器,您可以從頁面本身驗證它

ToolAcre 的可驗證選擇是加密還是什麼都沒有。該頁面在支援檢測期間調用瀏覽器 API,在失敗時禁用控件,並在產生以某種方式達到相同的缺失條件時讓引擎拋出 `InsecureRandomError` 。兩個分支後面都沒有隱藏 Math.random 後備。

在檢查產生器時使用該模式:識別來源、追蹤每個有界繪製、檢查縮減和洗牌,並強制使用不可用的來源路徑。然後分別評估裝置和目的地。健全的隨機來源對於該產生器的工作是必要的,但它並不是憑證整個生命週期的通用憑證。