日本語

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

モジュロ バイアスの説明: スキューなしでリストからランダムな単語を選択する

· 仕組み

パスワード ランダム性 暗号化

末尾を拒否した後に生成された偶数セットの横にある偶数番号のバケット
オリジナル ToolAcre ベクトル イラスト

範囲が均等に分割されていない場合に「リスト長を法とする乱数」が一部の単語を他の単語よりも優先する理由、スキューの大きさ、および拒否サンプリングによってどのようにスキューが除去されるかを示します。

公平なサイコロと不公平なショートカット — 7,776 を法とする乱数を取ることがサイコロを振ることと同じではない理由

公平な情報源でも、不公平な選択ルーチンにフィードを与えることができます。プログラムが整数を読み取り、リストの長さで除算した後の剰余をすぐに取得する場合、ソース範囲がその長さで正確に割り切れない場合、一部のインデックスはより多くのソース値を受け取ります。欠陥は削減ステップにあり、必ずしもバイトにあるわけではありません。 ToolAcre は、EFF 単語を選択する前にそのショートカットを回避します。

物理的なサイコロは、完全な結果グループが均等にマッピングされている場合にのみ、直感的な比較を提供します。ブラウザ実装には異なる生の範囲があるため、要求された境界の受け入れウィンドウを計算します。この記事では、ブラウザのバイトが文字通り 5 つのサイコロを再現すると主張するのではなく、その出荷されたメカニズムについて説明します。どちらもインデックスを選択できますが、その手順と監査証拠は異なります。

バイアスの原因 — 32 ビット値は 7,776 バケットに均等に分割されないため、最初の数ワードには 1 回の余分なチャンスが与えられます

1 バイトおよび 100 の範囲の場合、生の範囲には 256 の可能な値があります。 100 の 2 つの完全なグループが適合し、56 値が残ります。すべてのバイトを法 100 で削減すると、インデックス 0 ~ 55 にそれぞれ 3 つのプリイメージが与えられますが、インデックス 56 ~ 99 は 2 つだけを受け取ります。入力バイトは均一である可能性がありますが、選択されたバケットの分布は均一ではありません。

実装コメントは、2 バイトが直接削減される場合の 7,776 エントリ リストの対応する有限範囲の問題も導き出します。これらの数値は、想定される攻撃率からではなく、ソースで指定された実際の範囲から得られます。レビューで重要な問題は、残りの値が使用されるかどうかであり、生成された少数のフレーズでスキューが小さいように見えるかどうかではありません。

影響の大きさ - ランダムな範囲が広い場合は小さいがゼロではない、および暗号コードがその影響を受け入れることを拒否する理由

決定論的テストにより、不均一な尾が観察可能になります。境界 3、5、7、100、および 7,776 は意図的に不自然ですが、2 のべき乗の境界は拒否なしの場合を示しています。別の統計制御では、正しい関数と単純なモジュロ ヘルパーに同じ Web 暗号ソースを使用するため、テストではエントロピー ソースを非難するのではなく、削減戦略を分離します。

ToolAcre は、これらの分布チェックをクラック時間予測に変換しません。バイアスにより均一性が低下しますが、その低下を特定の攻撃者のコストに変換するには、完全な脅威モデルが必要です。エンジニアリング要件はより明確です。すべての適格なインデックスには、同じ数の受け入れられる生の値が含まれている必要があり、コードはそれを正確に強制できます。

実装コメントと決定論的テストで検証されたスキューの例

`secureRandomInt` は、最大の有効なインデックスを表すことができる最小の全体バイト数を見つけます。バイト範囲を計算し、境界で除算した後の剰余を減算し、結果 `limit` を呼び出します。その制限を下回る値は完全なグループに属します。それ以上の値は、モジュロ演算の実行が許可される前に破棄されます。

拒否ごとに新しい抽選が行われます。ループには高い固定天井があるため、注入されたソースが壊れてもタブが永久にぶら下がることはありません。範囲外の値が繰り返された場合、偏った答えを返す代わりにスローします。この失敗パスは正確さの一部です。疑わしいソースを拒否すると、返されるインデックスが均一の受け入れウィンドウからのものであるという約束が保持されます。

代替案 — 十分なビットを正確に描画して範囲外の値を破棄するか、ライブラリの均一整数関数を使用する

他の均一整数設計も可能ですが、それらはこのパッケージの動作ではないため、交換可能な ToolAcre オプションとしては表示されません。エンジンは 1 つの監査対象パスを公開します。 `secureRandomChoice` は、その入力が空でない配列であることを検証し、`secureRandomInt(items.length)` に委任して、単語の選択を有界整数コントラクトの直接のコンシューマにします。

ランダム パスワード ジェネレーターは文字に同じパスを使用し、安全な有界スワップによって駆動されるフィッシャー・イェーツ シャッフルを呼び出します。ランダム コンパレータで `sort` を使用しません。複数の機能の下に 1 つのプリミティブを保持すると、ソース レビューが扱いやすくなります。均一なリダクションを一度修正またはテストしてから、その呼び出し元に従います。

代替デザインはこのモジュールの外にあります。出荷されたパスでは拒否サンプリングが使用されます

バウンド 100 回帰テストでは、200 から 255、そして最後の 42 までのすべてのテール バイトが提供されます。正しいコードは、すべての 56 拒否バイトと 42 からの応答を消費します。 2 番目に焦点を当てたケースでは、200 と 7 が提供されます。 200 モジュロ 100 はゼロになるため、7 が返されることは、最初のバイトが静かに削減されたのではなく拒否されたことを証明します。

この動作例は設計上決定的であり、資格情報は含まれていません。実稼働バイトはブラウザ呼び出しに対してプライベートのままであり、ログには記録されません。テスト ソースは注入可能であるため、境界で動作を強制できます。パブリック パッケージには、生成されたパスフレーズを再現できる本番シード モードは提供されていません。

動作例: バインドされた 100 はバイト 200 を拒否し、次の 7 を受け入れます

浮動小数点ランダム リダクション、ライブラリ固有の均一 API、および無関係なシャッフル アルゴリズムは、この実装の対象外です。それらを評価するには、ソースと契約が必要になります。 ToolAcre のコードは整数ベースであり、明示的に境界が定められているため、代替案の調査を追加すると、テストが実際に証明する狭い主張が曖昧になってしまいます。

また、この記事では、均一に生成されたパスワードがすべてのポリシーやデバイスに適しているとは示唆していません。均一なインデックスの選択は 1 つのメカニズムに対応します。すべてのリスト要素が平等に選択される可能性がある場合でも、ストレージ、再利用、クリップボードの処理、マルウェア、宛先の制約は別の問題のままです。

要点 — パスフレーズ ジェネレーターは単語を均一に選択する必要があります。パスワード ジェネレーターの動作方法については、ツールのテクニカル ノートを確認してください。

パスフレーズ ジェネレーターは、生の範囲に残りが残っているという理由だけで、初期のエントリを優先してはなりません。 ToolAcre は Web Crypto からバイトを取得し、不完全な末尾を拒否し、完全に同じサイズのグループ内の値のみを削減します。テストでは拒否境界と合格境界の両方が強制されるため、クレームは出力の目視検査に基づいていません。

同様のコードをレビューするときは、選択したバイト幅の生の範囲を計算し、それを要求された境界で割って、破棄された余りを探します。尾部が拒否されない場合は、均一性の別の証明を要求します。ワードリストは公開することができ、ソースは暗号化されますが、不用意に削減すると回避可能なスキューが発生します。