日本語

テキストおよび日常ツール · パスワード生成ツール

PRNG と CSPRNG: ブラウザの乱数が実際にどこから来たのか

· 背景

パスワード ウェブ暗号化 csprng

拒否サンプリングを介して 1 つのワード インデックスに流れるブラウザ暗号バイト
オリジナル ToolAcre ベクトル イラスト

擬似ランダム ジェネレーターと暗号的に安全なジェネレーターの違い、オペレーティング システムがハードウェア イベントからエントロピーを収集する方法、およびそのランダム性が Web Crypto API を介して Web ページにどのように到達するかについて説明します。

コンピューターは決定論的ですが、ランダム性はどこから来るのでしょうか? — すべてのジェネレーターの背後にある基本的なパズル

ToolAcre で実行される JavaScript は API 境界から始まります。 `crypto.getRandomValues` からバイトを要求し、その呼び出しが成功したかどうかを監視し、返された配列を使用できます。特定のプラットフォームがその下で使用するすべての物理イベント、カーネル プール、またはハードウェア コンポーネントを検査することはできません。したがって、ワークブックのランダム性に関する起源の物語は、現地の証拠を超えています。

技術的に正直な説明は、観察が始まるところから始まります。アプリは Web Crypto を調査し、エンジンがそれをラップし、すべての選択がそのソースを消費します。プラットフォーム固有の内部情報には、ブラウザーのメソッド名から推測される一般的なステートメントではなく、プラットフォームのドキュメントと監査が必要です。

リポジトリはブラウザ API で開始されます。物理エントロピー ソースは監査しません

擬似ランダム ジェネレーターはシードと再現可能な状態によって記述されることがよくありますが、このリポジトリでは 1 つの Math.random デザインを共有するために JavaScript エンジンは必要ありません。 ToolAcre は、認証情報の生成において API を完全に禁止することで、曖昧さを回避しています。ソース スキャンでは、その否定的な保証が強制されます。

テストには依然として決定的なバイトが必要なので、内部パラメーターを通じて `getRandomValues` を公開するオブジェクトを挿入します。これらのフェイクはテスト サポート内に存在し、シードされた運用モードとしてエクスポートされません。テスト容易性では、反復可能なパスワードに対する非表示のユーザー オプションは作成されません。

Math.random は、ユニバーサル PRNG デザインを主張することなく、ここでは禁止されています

この製品は、範囲を限定した方法で「暗号化」を使用します。必要なブラウザー インターフェイスは Web Crypto であり、それが存在しないか使用できない場合、生成は失敗して閉じられます。アプリは、その型のみをチェックするのではなく、検出中にメソッドを呼び出し、呼び出しがスローされる制限された環境をキャッチします。

この契約は、あらゆる仮想状態の侵害に対する耐性を約束したり、ブラウザの実装を保証したりするものではありません。これは、ページがどの API をリクエストしているか、およびそれに伴って弱いフォールバックが接続されていないことを証明します。デバイスの完全性はジェネレータの外部に残ります。

検証された暗号化プロパティは、必須の Web 暗号化ソースと拒否パスです

タイミング イベント、専用プロセッサ命令、再シード スケジュール、オペレーティング システムのエントロピー プールはすべて Web API の表面の下にあります。パッケージ ソースでは検証できないため、ここでは何もアサートされません。将来のプラットフォーム固有の記事では、説明する各環境の主要なドキュメントが必要になります。

この省略は、現在の主張を弱めるのではなく、むしろ強化します。 ToolAcre は、ブラウザーに何を要求するか、バイトをどのように処理するかを正確に伝えることができます。 Math.random の拒否を正当化するために、JavaScript がエントロピー チェーン全体を監査できるかのように振る舞う必要はありません。

ハードウェア イベントとオペレーティング システム プールの詳細は実装上の主張であり、この情報源は証明していません

`getRandomValues` は、要求された排他的境界からサイズ変更された `Uint8Array` を埋めます。 `secureRandomInt` は、これらのバイトを符号なしビッグエンディアン数値としてアセンブルし、割り切れる最大の許容ウィンドウを計算し、残りの値を破棄します。受け入れられた値はインデックスに変換されます。

単語、区切り文字、文字、およびシャッフル交換はすべてこのパスを再利用します。単一のチョーク ポイントにより、ブラウザーから選択へのチェーンがレビュー可能になり、制限付きリダクションの修正が 1 つの忘れられた呼び出し元ではなくすべての生成モードに影響を与えるようになります。

getRandomValues から secureRandomInt まで: 表示されるブラウザーからインデックスへのパス

7,776 ワード プールの場合、関数はすべての有効なインデックスを表すのに十分なバイトを選択します。整数を形成し、計算された制限以上の値を拒否し、受け入れられた場合にのみ残りを返します。 `secureRandomChoice` は、その結果を使用して対象となる配列から 1 ワードを読み取ります。

特定の運用インデックスは非公開であり、ドキュメント内で複製すべきではありません。決定論的テストでは、代わりに既知のテールバイトと範囲内のバイトをフィードして、制御フローを証明します。これにより、生成されたフレーズを公開例にせずに、1 つの選択をトレースします。

作業例: 拒否サンプリングによる 1 つのリスト インデックスへのバイトのトレース

ハードウェア乱数生成器の設計と正式な暗号証明はパッケージの対象外です。サーバー ランタイムやネイティブ アプリケーションも同様です。この実装はブラウザ ジェネレータであり、その保証を無関係なシステムにコピーしないでください。

また、保管やその後の使用についても言及していません。 Web Crypto を通じて選択された値は、再利用、フィッシング、クリップボード履歴、マルウェアによって公開される可能性があります。 CSPRNG を選択すると、すべての資格情報処理の問題ではなく、ソースの問題が解決されます。

要点 — パスワード ジェネレーターはブラウザの暗号ジェネレーターにシークレットの適切なソースを尋ねます。

実用的なチェーンは短いです。Web 暗号化が機能することをテストし、機能しない場合は生成を拒否し、バイトを埋め、不均一な末尾を拒否し、受け入れられた値をインデックスにマップします。 ToolAcre は各ステップを可視化し、困難な限界をテストします。

曖昧な「ランダム」ラベルに頼るのではなく、そのチェーンを確認してください。次に、エンドポイントと宛先を個別に確認します。ブラウザの暗号化 API はこの製品の正しいソースですが、リポジトリはその下にあるものやそれに続くすべてのものを認証するとは主張しません。