入力すると更新される表示と操作
この画面は,入力欄の値が変わるたびに同じブラウザ内で評価関数を実行し,0〜4点の簡易スコア,文字種と長さから計算した理論ビット数,3種類の固定試行速度による時間目安を更新します.送信ボタンを押して診断する方式ではありません.目のアイコンは入力欄のtypeをpasswordとtextの間で切り替え,クリアボタンは現在の入力を空にします.
入力値は評価のためにReactの状態と画面のDOMへ置かれます.診断コンポーネントには,入力をデータベース,ローカルストレージ,IndexedDBへ保存する処理や,履歴一覧を作る処理はありません.再読み込みやページ移動で画面の状態は初期化されますが,使用したメモリ領域をゼロで上書きする処理はなく,端末上の痕跡が物理的に消去されたことまでは保証しません.
コピーを押すとClipboard APIへ現在の入力を書き込み,成功した場合だけ2秒間チェック表示に変わります.2秒後に戻るのはアイコンだけで,クリップボードを消去する動作ではありません.OSのクリップボード履歴やブラウザ拡張が値へアクセスできるかどうかは,このコンポーネントから制御できません.実際に使っている重要なパスワードを貼らず,同じ特徴のテスト用文字列で仕組みを確認する選択肢もあります.
「16文字候補を生成」は,入力欄へ新しい候補を入れて同じ評価を行う補助機能です.診断結果をファイルへ保存したり,利用先サービスのパスワードを変更したり,パスワードマネージャーへ登録したりはしません.表示されたラベルも,特定サービスの要件を満たすという合格通知ではありません.
文字プールと理論ビット数
理論ビット数の計算では,入力にASCII小文字があれば26,ASCII大文字があれば26,数字があれば10,それ以外の文字があれば33を候補プールへ加えます.たとえば小文字と数字だけなら36種,4分類すべてを含めば95種です.入力で実際に使われた文字の種類数を数えるのではなく,1文字でも見つかった分類の全体を候補とみなします.
表示値は,JavaScriptのpassword.lengthにlog2で求めたプール1文字あたりの情報量を掛け,四捨五入した整数です.式は「UTF-16コード単位の長さ × log2(仮定プール数)」です.小文字だけのpasswordは8×log2(26)を丸めて38ビットになります.小文字・大文字・数字・記号を含む12コード単位なら,12×log2(95)を丸めて約79ビットです.
この長さは利用者が目で数える文字数やUnicodeの書記素数とは限りません.一般的な絵文字はJavaScriptのUTF-16では2コード単位になるため,絵文字1個でも長さ2として計算される場合があります.日本語,空白,絵文字はASCII英数字ではないため,すべて同じ「記号あり」の判定に入り,33種を加えるだけです.漢字の種類数や絵文字の全候補数を調べる機能はありません.
計算は,各位置が仮定したプール全体から一様かつ独立に選ばれた場合の候補空間です.人が考えた単語,日付,名前,置換規則,キーボード上の癖は理論値へ反映しません.DogCat123!のような入力も95種から10コード単位を無作為に選んだものとして計算します.実際の生成過程が予測可能なら,表示値は実効的な推測困難性を大きく見積もる場合があります.
これはハッシュ値の解析や統計的な実測エントロピーではありません.
0〜4点の簡易スコアと限定検知
スコアは0点から始まり,8コード単位以上で1点,12以上でもう1点を加えます.小文字・大文字・数字・記号の4分類のうち3種類以上を含めば1点,4種類すべてを含み長さ10以上ならもう1点を加えます.最大は4点です.0〜4点を順に「非常に脆弱」「脆弱」「普通」「強固」「極めて強固」という5段階ラベルへ対応させます.
メーターの棒は4本です.0点でも入力が空でなければ最初の1本を赤く表示しますが,これは1点を得たという意味ではなく,「非常に脆弱」の状態を見えるようにする表示です.ラベルと点数を確認し,棒の本数だけで判断しないでください.点数条件はこの画面独自のもので,NISTなど外部規格の認証結果ではありません.
減点条件は3種類です.第一は内蔵する20件の文字列との完全一致で,大文字小文字を無視します.password,123456,qwerty,adminなどが含まれますが,大規模な漏えいコーパスや辞書へ接続しているわけではありません.部分一致,利用者名,メールアドレス,サービス名,過去に使った値も調べません.
第二は同一文字が4回以上連続する箇所です.第三は,abcdefghijklmnopqrstuvwxyz01234567890qwertyuiopasdfghjklzxcvbnmという固定文字列の中に,入力から取り出した順方向4文字が含まれるかの確認です.abcd,1234,qwerなどが対象になります.
逆順,日付,一般的な文字置換は対象外で,固定文字列の連結境界にある90qwのような並びは一致します.
3条件のいずれかに当たると2点を引きます.複数条件に当たっても減点を重ねず,下限は0点です.また,長さ4未満は最後に0点へします.passwordは長さによる1点を得た後,共通文字列との一致で0点になります.ただし,このパターン減点はスコアだけに適用し,第2章の理論ビット数と次章の時間表示を減らしません.同じ入力のラベルと時間が異なる印象を与える場合があるのは,この計算経路の違いによります.
三つの単純総当たり時間
時間表示は,仮定プール数を入力長で累乗した候補総数を求め,平均で半分を試した時点で正解へ到達すると仮定します.その半分の候補数を,毎秒100回,毎秒10,000回,毎秒100,000,000,000回の3種類で割ります.画面では順に「低速オンライン仮定」「固定仮定」「高速オフライン仮定」として表示します.特定のPC,GPU,スーパーコンピューターを測定した値ではありません.
小文字だけのpasswordを例にすると,候補総数は26の8乗,平均試行数はその半分です.毎秒100回なら約33年,毎秒1万回なら約121日,毎秒1000億回なら約1秒という表示になります.しかし,この入力は内蔵20件の共通文字列にも一致するため,実際の攻撃者は総当たりの順番を待たず早い段階で試す可能性があります.時間計算はその優先順位を反映しません.
秒数は1秒未満を「即時」とし,秒,分,時間,日,年,千年,百万年へ丸めて表示します.JavaScriptの数値範囲を超えてInfinityになった場合は「表示上限超過」とします.これは解読が永久に不可能という意味ではなく,この単純式を通常の数値として表示できない状態です.
実際のオフライン推測速度は,利用先が保存に使うハッシュまたは鍵導出方式,Salt,コスト係数,攻撃用ハードウェアに依存します.オンラインではレート制限,アカウントロック,検知,多要素認証が結果を左右します.この画面にはそれらを入力する欄がなく,辞書攻撃,漏えい値の再利用,ルールベース攻撃,フィッシングも時間へ反映しません.時間は比較用の固定モデルであって,特定アカウントの解読期限ではありません.
内蔵16文字候補の生成条件
内蔵生成器は,小文字26種,大文字26種,数字10種,記号8種の合計70種を使います.まず各グループから1文字ずつ選び,4種類を最低1文字含む状態を作ります.その後,70種の結合プールから12文字を追加し,合計16文字をFisher–Yates方式で並べ替えます.生成件数と長さ,記号集合は画面から変更できません.
文字選択と並べ替えには共通の安全な乱数関数を使います.これはcrypto.getRandomValuesで32ビット値を得て,候補数で均等に分けられない上端の値を捨てて取り直す拒否サンプリングを行います.Web Cryptoが利用できなければMath.randomへ切り替えず,生成を止めてエラーを表示します.
W3C仕様はgetRandomValuesを暗号学的に強い乱数値を得るAPIとしますが,情報理論上のエントロピー下限までは定めていません.
生成器の候補プール70種と,診断側の仮定は一致しません.生成結果には8種の記号のどれかが必ず入りますが,診断は記号ありを33種として扱い,全体を95種と仮定します.そのため生成直後に表示する理論値は,生成器が実際に用いた文字集合と最低1文字保証を表す厳密なエントロピーではありません.通常は4分類と16文字により4点になりますが,偶然に固定の連続パターンや4連続文字を含めば減点される場合があります.
生成候補を採用する際は,利用先の最大長,使用可能な記号,固有の要件を確認します.内蔵生成器は候補を画面へ入れるだけで,利用先への登録,履歴保存,パスワードマネージャーへの移動はしません.さらに長さや類似文字除外を選びたい場合は,関連するWeb Cryptoパスワード生成器を使い分けてください.
結果の使い方とデータ範囲
NIST SP 800-63B-4は,利用者が選んだパスワードの実効強度を情報理論的エントロピーとして推定することは難しいと説明し,長さを主要因として扱います.また,サービス提供者には一般的・予想可能・漏えい済みパスワードとのブロックリスト照合,失敗試行のレート制限,パスワードマネージャーと貼り付けの許可などを求め,文字種を混ぜる構成ルールは課さないとしています.
同文書の最低長15文字は単一要素認証を提供する検証者,最低8文字はMFAの一部としてパスワードを使う検証者への要件です.この画面の8・12コード単位という加点基準とは目的も対象も異なります.画面が4点を出しても15文字以上になるとは限らず,20件の照合はサービス側に求められる十分なブロックリストの代わりになりません.
診断コンポーネントには入力値を診断目的で外部送信する処理がありません.ただし,ページ表示用ファイル,アクセス解析,広告など,ページ全体の別通信が発生する場合があります.入力値はDOMとJavaScript状態へ置かれ,表示ボタンを押せば画面へ平文で出て,コピーすればOSのクリップボードへ渡ります.ブラウザ拡張,端末マルウェア,画面の盗み見はこの簡易診断では防げません.
スコア,理論ビット数,時間の三つはそれぞれ違う仮定で計算されます.高い値は,再利用,フィッシング,パスワードリスト攻撃,利用先の保存不備を検出しません.アカウントごとに固有の値を使い,利用先が対応するならパスワードマネージャーや多要素認証を組み合わせてください.実際のパスワードを入力する必要がない場合は,同じ長さと構成のテスト文字列で計算傾向だけを確認してください.