パスワードツール ジェネレーターに戻る

セキュリティガイド

Web Crypto と拒否サンプリングによるクライアントサイドパスワード生成ホワイトペーパー

PwdGen のブラウザ内パスワード生成における乱数源、拒否サンプリング、エントロピーの境界、プライバシー上の限界を説明します。

概要

PwdGen のクライアントサイド参照生成方式は、ブラウザまたは実行環境の Web Crypto から乱数を取得し、拒否サンプリングでその値を偏りのない有限範囲のインデックスに変換し、Fisher-Yates シャッフルで必須の文字種を最終パスワード全体に分散させます。この方式は小さく監査しやすい形を保ち、Web アプリ、API アダプター、CLI、準備中の pwdgen-core パッケージで再現できるようにしています。

本文はエンジニアリング上の説明であり、新しい暗号プリミティブ、業界標準、第三者監査済み製品であることを主張するものではありません。

乱数源

生成器は crypto.getRandomValues() を通じて暗号学的に強い乱数を要求します。Web Crypto の実装は通常、ホスト環境が提供する高品質なエントロピーでシードされた暗号学的擬似乱数生成器を使用します。実際のブラウザは、基盤となる乱数性を OS やプラットフォームの暗号機能に委ねます。

PwdGen は、各生成呼び出しが CPU のハードウェアノイズ源を直接読むとは主張しません。正確には、ブラウザが Web Crypto API を通じて CSPRNG 出力を提供し、PwdGen は暗号用途ではない擬似乱数インターフェースを避けます。

一般的な乱数を使わない理由

Math.random() のような一般的なスクリプト用乱数はセキュリティ用途として規定されていません。シミュレーション、視覚効果、通常の UI ランダム化には使えますが、パスワード、リセットコード、署名鍵、その他の認証情報の乱数源には適していません。

Web Crypto が使えない環境では、PwdGen は弱い乱数に silently fallback するのではなく、互換性エラーを表示すべきです。

拒否サンプリング

ランダムな整数は通常 2 の冪の範囲から得られます。一方で、パスワードの文字集合のサイズがその範囲をちょうど割り切ることは多くありません。単純に剰余を取ると、一部の文字がわずかに選ばれやすくなります。

PwdGen は拒否サンプリングを使います。

  1. 32 ビットの符号なし整数を読み取る。
  2. 文字集合のサイズで割り切れる最大の 32 ビット境界を計算する。
  3. その境界を超えた値を捨てる。
  4. 完全な範囲内の値だけに剰余演算を適用する。

これにより、境界付きの文字選択を均一に保ち、剰余バイアスを避けます。

文字種の保証と理論エントロピー

パスワードポリシーがある場面では、生成器は有効な各文字種からまず 1 文字ずつ選び、残りを結合済みの文字集合から埋め、最後にシャッフルします。これにより一般的なポリシーを満たしつつ、特定の文字種が固定位置に出る予測可能性を避けます。

理論エントロピーの推定式は次のとおりです。

bits = length × log2(uniqueAlphabetSize)

この値は、設定された文字集合から一様ランダムに選ぶ場合の理論上限です。再利用、手作業での編集、侵害された端末、漏えい済みパスワード、保存先サービスの弱い保管方式までは反映しません。

プライバシー境界

ブラウザ内ツールでは、生成値はユーザーがコピーまたはエクスポートするまで、ページメモリと表示結果欄にのみ存在します。ローカル生成器は生成パスワードを PwdGen のサーバーへ送らず、URL や解析イベントにも書き込みません。

この境界は、悪意あるブラウザ拡張、クリップボード管理ツール、OS の侵害、画面録画、フィッシングページ、または信頼できないサービスへの貼り付けまでは防げません。

再現可能な実装

公開済みの pwdgen-cli と準備中の pwdgen-core は、生成モデルを Web ページの外でも確認できるようにするためのものです。テストでは、文字種、除外文字、無効設定、エントロピー計算、弱い乱数 fallback が存在しないことを確認します。

目的は PwdGen を私的な標準として宣言することではありません。実装を小さく透明に保ち、開発者が読み、テストし、必要に応じて自分の信頼境界に合わせて置き換えられるようにすることです。

ソース