8個の数字を3つの文字に置き換えると回数が変わります

0から7までの整数が等しい確率で出ると仮定し、3で割った余りを文字の番号にします。余り0と1は各3回、2は2回です。元の数値が一様でも、余りの分布は一様ではありません。これがこの例の剰余による偏りです。

0 % 3 = 0    1 % 3 = 1    2 % 3 = 2
3 % 3 = 0    4 % 3 = 1    5 % 3 = 2
6 % 3 = 0    7 % 3 = 1
// counts: [3, 3, 2]

最後の2つの数字を拒否すると、同じ回数になります

6と7を棄却し、新しい数値を取得します。受け入れる0から5では、各余りが2回ずつ現れます。元の数値が一様という仮定のもとで、受け入れる範囲の偏りを取り除きます。棄却した数値を再利用するわけではありません。

0から7を3で割った残りの回数3 3 2と、6と7を拒否した後の回数2 2 2の比較
直接計算した小さな例の頻度図です。左は0~7全体、右は0~5だけ許容した結果です。ブラウザの乱数の実測分布ではありません。

MoyoutilのrandomIntはcrypto.getRandomValuesでUint32Array(1)を埋めます。境界は2^32を選択肢数で割り、切り捨ててから選択肢数を掛けた値です。境界以上の値は棄却し、新しい数値を取得します。選択肢が3つなら境界は4294967295で、最大値だけを棄却します。

Math.floor(4294967296 / 3) * 3
// 4294967295
// accept: 0 through 4294967294
// reject: 4294967295

W3C Web Cryptography: getRandomValues

Web Cryptography ドキュメントは、getRandomValues が暗号学的に強い乱数を生成することを規定しています。この記事の検証は、プロジェクトコードが拒否境界を処理していることを確認したものであり、オペレーティングシステムのエントロピーや特定のブラウザ乱数の実装を監査したものではありません。

文字の種類を含めることと各位置を独立に選ぶことは異なる

現在のツールは、選択した各文字の種類から最初に1文字ずつ取り、残りの桁を選択した文字全体で埋め、順序を混ぜます。したがって、選択した種類は少なくとも1回含まれます。すべて大文字を選択した場合と4種類を選択した場合は、同じ生成条件ではありません。文字の種類を保証するだけでパスワードの安全性を保証したり、単純なケースの数を実際の推測時間に変更したりすることはできません。

長さは4から128の整数で、文字の種類を1つ以上選びます。小数、範囲外、すべての種類を未選択にした場合はエラーです。4文字を受け付けることは、安全な最小長が4文字という意味ではありません。NIST SP 800-63B-4は、適用対象の検証システムに対し、単一要素認証のパスワードは15文字以上、多要素認証の一部なら8文字以上を要求します。すべてのサイト共通の入力規則ではありません。

NIST SP 800-63B-4: パスワード検証者の要件

結果の保存と画面の消去を区別する

  1. 使用するサービスの許容長さと文字条件を確認してください。 Moyoutilのデフォルトの長さは20で、長さと種類を調整できます。
  2. 現在の設定で新しいパスワードを生成します。設定を変更すると古い結果が消え、コピーが無効になります。もう一度生成ボタンを押してください。
  3. サイトごとに異なるパスワードを使用し、パスワード管理者に保存します。このツールはパスワードライブラリやサービスログイン機能を提供しません。
  4. 画面結果の消去は画面を消去しますが、コピーしたクリップボードの内容までは削除しません。クリップボードと共有デバイスの状態を別々に確認してください。

NIST SP 800-63B-4:パスワード管理者とサービス固有のパスワード

現在、生成結果はツールサーバーに送信または保存されません。ただし、入力やクリップボードを読み取る拡張機能、共有端末、アカウントのフィッシングダメージまでブロックする機能ではありません。公開されたサンプル文字列を実際のアカウントパスワードとして使用しないでください。

よくある質問

特殊文字をすべて選択する必要がありますか?

文字の種類だけで安全性を判断できません。使用サービスの条件、十分な長さ、サービスごとに異なる値と安全な保管を一緒に確認してください。

この記事がブラウザの乱数品質を検証したものですか?

いいえ。小さな範囲を列挙し、プロジェクト関数の棄却境界を再現しました。ブラウザのエントロピーやパスワードを推測する時間は測定していません。