セキュリティガイド
Web Cryptoと棄却サンプリングを用いたクライアントサイドパスワード生成
PwdGenのブラウザサイドパスワード生成モデル、エントロピーの境界、棄却サンプリング、プライバシー制限について説明する技術ホワイトペーパー。
要約
PwdGenはクライアントサイドの参照生成方式を使用します。ブラウザまたはランタイムのWeb Cryptoがランダムバイトを提供し、棄却サンプリングによってそれらのバイトを偏りのない有界インデックスにマッピングし、Fisher-Yatesシャッフルで必要な文字クラスを最終的なパスワード全体に分散させます。この方式は意図的に小さく、監査可能で、Webアプリ、APIアダプター、CLI、および準備されたpwdgen-coreパッケージ間で再現可能です。
このドキュメントはエンジニアリングモデルを説明するものです。新しい暗号プリミティブ、正式な標準、または独立した第三者監査を主張するものではありません。
乱数ソース
ジェネレーターはcrypto.getRandomValues()を通じて暗号学的に強いランダム値を要求します。Web Cryptoの実装は、ホスト環境が提供する高品質のエントロピーでシードされた暗号学的に安全な疑似乱数生成器を使用することが期待されています。実際には、ブラウザはこの責任をオペレーティングシステムの機能やプラットフォームの暗号プロバイダーに委任します。
PwdGenは、すべてのパスワード生成呼び出しが直接ハードウェアノイズソースをサンプリングするとは主張しません。より安全で正確な表現は、ブラウザがWeb Crypto APIを通じてCSPRNG出力を提供し、PwdGenが非暗号学的な疑似乱数インターフェースを回避していることです。
Math.random()を使わない理由
Math.random()はセキュリティに敏感な用途には指定されていません。シミュレーション、視覚効果、通常のランダム化されたUI動作には適していますが、パスワード、リセットコード、署名鍵、その他の認証情報に期待される保証を提供しません。
PwdGenは、安全でない疑似乱数フォールバックを障害状態として扱います。Web Cryptoが利用できない場合、ジェネレーターは弱い認証情報を静かに生成するのではなく、互換性エラーを表示するべきです。
棄却サンプリング
ランダムバイトと整数は通常、2のべき乗の範囲から取得されます。パスワードのアルファベットのサイズがその範囲を正確に分割することはほとんどありません。直接の剰余演算では、一部の文字が他よりもわずかに出現しやすくなることがあります。
PwdGenは棄却サンプリングを使用します:
- 32ビットの符号なし整数を取得します。
- 32ビット範囲内に収まるアルファベットサイズの最大の倍数を計算します。
- その境界を超える値を拒否します。
- 残りの完全な範囲にのみ剰余を適用します。
これにより、測定可能な剰余バイアスを導入することなく、有界な文字選択の一様性が維持されます。
文字カバレッジとエントロピー
設定されたパスワードポリシーに対して、ジェネレーターは最初に有効な各クラスから1文字を選択し、残りを結合アルファベットから埋め、その後結果をシャッフルします。これにより、予測可能なクラスが予測可能な位置に配置されることなく、宛先のパスワードルールを満たすのに役立ちます。
理論的なエントロピー推定値は次のとおりです:
bits = length × log2(uniqueAlphabetSize)
この値は、設定されたアルファベットから一様ランダムに選択した場合の上限です。パスワードの再利用、ユーザーによる編集、デバイスの侵害、漏洩したパスワード、または宛先サービスによる弱い保存は考慮していません。
プライバシーの境界
ブラウザツールでは、生成された値はユーザーがコピーまたはエクスポートするまでページメモリと表示結果フィールドに残ります。ローカルジェネレーターは、生成されたパスワードをPwdGenサーバーに送信したり、URLに含めたり、分析イベントに書き込んだりしません。
この境界は、悪意のあるブラウザ拡張機能、クリップボードマネージャー、オペレーティングシステムの侵害、スクリーンキャプチャ、フィッシングページ、またはユーザーが生成したパスワードを安全でない宛先に貼り付けることから保護するものではありません。
再現可能な実装
公開のpwdgen-cliパッケージと準備されたpwdgen-coreパッケージは、Webページの外部でも生成モデルを検査可能にするために存在します。単体テストでは、文字クラスの包含、除外文字、無効な設定、エントロピー式、および安全でない疑似乱数フォールバックコードパスの不在をカバーしています。
目標はPwdGenを独自の標準にすることではありません。目標は、開発者が環境が異なる信頼境界を必要とする場合に、実装を読み、テストし、置き換えられるほど小さくすることです。