テキストおよび日常ツール · パスワード生成ツール
crypto.getRandomValues と Math.random: パスワードが重要な理由
· 仕組み
パスワード ウェブ暗号化 ランダム性
ブラウザの汎用乱数生成器と暗号化乱数生成器の違い、予測可能性がパスワードにとって致命的である理由、およびツールがどちらを使用するかを判断する方法について説明します。
パスワードではなく、サイコロ ゲームには十分なランダム性 - ブラウザが提供する 2 種類のランダム性
ブラウザは不規則に見える値のソースを複数提供できますが、視覚障害はシーケンスが資格情報に適しているという証拠にはなりません。 ToolAcre は製品の厳格な境界線を引きます。すべての単語の選択、区切り文字の選択、文字の選択、およびシャッフル スワップは、`crypto.getRandomValues` によってサポートされる 1 つの安全な整数関数を通過します。その API が使用できない場合、ページは、もっともらしい代替物を生成するのではなく、生成を無効にします。
2 つのサンプル出力が同じようにごちゃ混ぜに表示されるかどうかよりも、その拒否の方が重要です。予測可能なソースでも、人にとって説得力があるように見える文字、数字、単語を印刷できます。したがって、この実装により、ソースが監査可能になり、障害が可視化されます。生成された値がすべての環境に対して安全であるとは主張しません。侵害されたブラウザまたはデバイスでも、ページに表示されている内容を読み取ることができます。
Math.random の目的 — 少数の観測値から出力を再構築できる、高速でシードされた擬似乱数
ワークブックでは、Math.random をいくつかの観察から再構築可能なシードされた擬似乱数として説明していますが、これらは一般的な実装の主張であり、このリポジトリがすべての JavaScript エンジンに対して確立するわけではありません。この製品のローカルな事実はより単純かつ強力です。プロダクション ジェネレーター ファイルは `Math.random` を呼び出しません。ソースレベルのテストでは、コメントが削除され、実行可能コードがスキャンされ、そのような呼び出しがエンジンまたはパスワード アプリのどこかに出現すると失敗します。
この区別により、この記事が実装ルールを普遍的なブラウザーの歴史の講義に変えることは避けられます。 ToolAcre は、パスワード生成用の API を拒否するために、考えられるすべての Math.random アルゴリズムを特徴付ける必要はありません。そのパッケージは、Web 暗号化またはテストで使用される挿入された安全なソースを受け入れますが、シード、決定論的モード、または弱いフォールバックのための運用オプションを公開しません。
このリポジトリが Math.random について証明していること: Math.random は実稼働世代には存在しない
`createWebCryptoSource` は、呼び出し可能な `getRandomValues` を探し、そのメソッドをパッケージのランダム ソースとしてラップします。アプリケーションは、コントロールを有効にする前に追加のプローブを実行します。グローバル暗号オブジェクトに対して、try ブロック内の 1 要素の型付き配列を埋めるように要求します。これにより、表面的な機能チェックを信頼するのではなく、プロパティが存在するが使用時にスローされる制限された環境を捕捉します。
ソースはブラウザ API 境界で停止します。どのオペレーティング システム プール、ハードウェア命令、または再シード設計が特定のブラウザの下にあるのかを証明するものではありません。これらの詳細はインターフェイスの下で異なるため、プラットフォームのドキュメントが必要です。このコードが証明しているのは、指定された Web Crypto メソッドを通じてバイトが到着し、プローブが失敗した場合には生成が試行されないということです。
crypto.getRandomValues がここで行うこと: ブラウザー API を通じて型付き配列を埋めます
資格情報ジェネレーターは、オブザーバーが以前の出力から再現できない新しい選択を行うことになっているため、予測可能性は危険です。 ToolAcre は、決定論的な運用パスを拒否し、すべての描画を一元化し、弱い API が存在しないことをテストすることでその目標をサポートします。画面キャプチャ、拡張機能、マルウェア、フィッシング、パスワードの再利用、または送信後に認証情報を誤って処理するサービスから免れることを約束するものではありません。
この境界により、一般的なカテゴリ エラーが防止されます。生成では、後で候補に起こるすべてのことではなく、候補がどのように選択されるかが考慮されます。パッケージは文字列を返しますが、それをログに記録したり保存したりしません。ページはメモリ内に 1 つの現在の値を保持し、それをテキストとしてレンダリングします。パスワードの保管、送信、アカウント回復および認証ポリシーは、引き続き他のシステムの責任となります。
コードを読む — ページが使用する API を確認する方法、およびオープンで検査可能なページが信頼されやすい理由
コードの読み取りは `packages/password-generator/src/index.js` から始まり、その契約では、ランダムな決定はすべて `secureRandomInt` に達すると規定されています。実装ファイルには、`getRandomValues`、拒否サンプリング、および明示的なエラーが表示されます。最後に、`no-math-random.test.js` とより広範なパスワード セキュリティ スイートにより、「Math.random は決して使用しません」を未テストのコメントのままにする代わりに、否定保証を実行可能にします。
オープンソースだけではコードが正しくなるわけではありませんが、レビュー担当者に具体的な継ぎ目を検査させることができます。ランダムなソースを検索し、選択肢やシャッフルを通じて呼び出し元を追跡し、API が見つからない場合に何が起こるかを検査します。信頼できるレビューでは、ブランドからセキュリティを推測するのではなく、成功パスと拒否パスの両方を指定できる必要があります。
有効な例 — 同じ単語選択ルーチンを両方の方法で記述し、攻撃者がそれぞれの方法で実行できること
100 未満の整数のリクエストを考えてみましょう。 `secureRandomInt` には 1 バイトが必要で、その範囲には 256 値が含まれます。 200 より前で終わる、100 で割り切れる最大のプレフィックスのみを受け入れ、残りの末尾は拒否します。決定論的テストでは、バイト 200 に続いてバイト 7 がフィードされます。実装は 200 を破棄し、7 を返します。直接モジュロ ショートカットでは、拒否されたバイトから 0 が返されます。
同じ安全な整数関数が単語と文字のインデックスを選択するため、この例は生成から切り離されたおもちゃではありません。本番環境での正確なバイトは再現可能な例ではないため、資格情報として公開しないでください。有用なアーティファクトは制御フローの証明です。Web 暗号化がバッファーを埋め、不均一な末尾は拒否され、受け入れられた値のみが限定された選択肢になります。
実用的な例: 出荷された secureRandomInt パスを介して 1 つの境界付き描画をトレースします
このリポジトリは、サーバー側ジェネレーター、ハードウェア乱数ジェネレーター、またはオペレーティング システムのコマンド ライン ツールの実装または比較を行いません。また、JavaScript からブラウザ暗号化実装の内部を監査することもできません。これらのトピックには、ToolAcre コード パスに貼り付けられたアナロジーではなく、独自のソース資料、脅威モデル、および動作チェックが必要です。
このページはパスワード マネージャーでもありません。生成したものは保存、同期、送信、自動入力されません。読者は、「暗号ランダム ソース」を、結果を再利用したり、安全でないチャネルを通じて移動したりするためのアドバイスとして解釈すべきではありません。このクレームは、現在のブラウザー タブ内の選択にのみ属します。
要点 — パスワード ジェネレーターはブラウザーの暗号化乱数ジェネレーターを使用しており、ページ自体から検証できます。
ToolAcre の検証可能な選択は、暗号化か何もなしです。このページはサポート検出中にブラウザー API を呼び出し、失敗するとコントロールを無効にし、生成が何らかの理由で同じ欠落状態に達した場合はエンジンに `InsecureRandomError` をスローさせます。どちらのブランチの背後にも Math.random フォールバックは隠されていません。
ジェネレーターをレビューするときにこのパターンを使用します。ソースを特定し、すべての境界付き描画をトレースし、リダクションとシャッフルを検査し、使用できないソース パスを強制します。次に、デバイスと宛先を個別に評価します。このジェネレーターの仕事にはランダムな音声ソースが必要ですが、それは資格情報の全生涯にわたる普遍的な証明書ではありません。