ローカルの弱いパスワード一覧が証明できること、それが全ウェブ照会ではない理由

「このパスワードは漏洩しているか」は、しばしば一つの作業として語られます。実際には少なくとも三つあります。平文をサイトへ渡す、ハッシュの先頭だけを Have I Been Pwned へ送る、今のタブで公開の高頻度一覧と照合する。確認の対象はページ上の「ローカル」という語ではなく、今回のリクエストがどの経路を通ったか、ヒットと未ヒットがチケットに書ける文はどれか、です。

先に結論です。ローカルの弱いパスワード一覧が支えられるのは、「この文字列は、すでに広く悪用されているパスワードに似ているか」という狭い事実だけです。未ヒットは、どの漏洩にも一度も出ていない証明にはなりません。ヒットは、ありふれすぎているので今すぐ変える、という意味だけです。Have I Been Pwned のパスワードレンジ照会は別プロトコルで、送るのは SHA-1 の先頭 5 文字です。任意の「オンライン漏洩チェック」へ平文を貼る前に、これから走らせるのが三つのうちどれかを確認してください。

検索意図に一文で答える

ローカルの弱いパスワード一覧が証明できるのは、次の一点だけです。いま入力した文字列が、「すでにこのタブへダウンロードされた公開の高頻度一覧」に当たるか、当たらないか。全ウェブで見たことがない、という証明にはなりません。自分のメールがどの漏洩に入っているか、という問いにも答えません。Have I Been Pwned(HIBP)の Pwned Passwords レンジ照会は別の道です。この端末で SHA-1 を計算し、十六進の先頭 5 文字だけを https://api.pwnedpasswords.com/range/{prefix} へ送り、残りの接尾辞はクライアント側で照合します。

この記事は、古いパスワードを「ちょっと調べたい」開発者や運用、そして同僚から「オンラインのパスワード漏洩チェック」のリンクを渡されたサポート向けです。パスワード強度チェックの操作説明の代わりにはならず、「ローカル暗号化が平文を出していないか」の Network 総論も繰り返しません。持ち帰るべきなのは、三つの調べ方がこの端末から何を出すか、ローカル一覧がどこまでの変形を見るか、ヒットと未ヒットがチケットに書ける文はどれか、です。

三つの「漏洩チェック」は同じ仕事ではない

日本語で「パスワード漏洩チェック」と検索すると、結果ページはまったく違うプロトコルを並べます。入力欄の文字をそのまま POST するサイト、HIBP の k-匿名性レンジ API を呼ぶサイト、短い単語表だけを落としてブラウザ内で辞書引きするサイト。三つとも画面上では「見つかりません」「漏洩しています」と出せます。リクエスト行は違い、支えられる結論も違います。

日本の解説では、攻撃側もよく三つに分けます。よくある単語を順に試す辞書攻撃、考えられる組み合わせを尽くす総当たり攻撃、別サービスで漏れた ID とパスワードの組を別サイトへ試すパスワードリスト攻撃(リスト型攻撃)です。ローカルの高頻度一覧が直接止められるのは、辞書攻撃の入口、つまり 123456 や password のような、すでに使い古された文字列です。リスト型攻撃の本体である「このメールとこのパスワードの組が、別の漏洩に出ていたか」は、短い公開一覧では答えられません。Have I Been Pwned のパスワード照会が答えるのも、組ではなく「このパスワード文字列のハッシュが、いまの索引にあるか」です。

OWASP Authentication Cheat Sheet は、登録とパスワード変更の流れで「よくある/すでに漏洩したパスワードを拒否する」と書き、Pwned Passwords と SecLists のような公開リストの両方を名指しします。八百行程度のローカル一覧と、十億規模のハッシュ庫を、同じ証拠とは書いていません。チケットに「調べた、漏洩なし」とだけあると、次に読む人は、どの網を使ったのか判断できません。

やり方 この端末を出るもの 未ヒットで書ける文
平文または完全なハッシュのアップロード パスワードそのもの、または復元/照合に足りる完全な要約 相手のサイトが今回赤く出さなかった、だけ。安全の証明にはならない
HIBP のレンジ照会 SHA-1 または NTLM の先頭 5 桁(十六進) HIBP のいまの索引に、このハッシュは無かった
この端末の公開高頻度一覧 一覧ファイルそのもの。対象パスワードはタブに残る この短い一覧と、その変形規則には当たらなかった

三つ目でも、通信はあります。ブラウザは一覧ファイルを GET します。それは公開の単語表であり、あなたのパスワードではありません。「どちらもネットに出たから、どちらもアップロードだ」とまとめると境界を誤ります。逆に、ページに「ローカル」と書いてあること自体を証拠にすると、一つ目のサイトを見逃します。

いま使っている本番のパスワード、まだ回していない API トークン、個人のネット銀行のパスワードで実験しないでください。この回にしか出ない偽パスワードをカナリアにしてください。例は CanaryPwd-20260902-xK9 です。確認するのは、リクエストがこの文字列を運んだかどうかであり、本物の秘密をもう一度晒すことではありません。

ローカル一覧が実際に照合するもの

FastPwd のパスワード強度チェックを例にします。一覧は同一オリジンの data/leaked-top10k.txt からページと一緒に落ち、この端末で小文字キーから順位への表を作ります。ファイル名の top10k は、公開の高頻度リストによくある名付けです。そのリクエストの応答を開くと、空行を除いて八百行強あり、先頭は 123456、password、qwerty のような、繰り返し漏洩してきたパスワードです。製品文面は、これを「一万件」とも「全ウェブの漏洩集合」とも書きません。

照合は、完全一致を一回やって終わりではありません。実装は四段階で、どれか一つに当たれば赤くし、等級を強制的に「弱い」へ落とします。

  1. 完全一致:入力が一覧の項目と一字一句同じ。
  2. 大文字小文字の無視:先に小文字へしてから探す。Password と password は同じ一行。
  3. 末尾 0〜999 の除去:qwerty123 は先に qwerty へ縮めてから探す。
  4. よくある Leet:@/4→a、3→e、1/!→i、0→o、5/$→s、7→t。末尾数字を先に外してから、この置換をしてもよい。

入力が 128 文字を超えると、後ろの二段階は走らず、完全一致と大文字小文字だけが残ります。一覧の読み込みに失敗したときは、内蔵の最小集合へ落ちます。password、123456、12345678、qwerty、admin123 です。状態行には、検査はなおこの端末で完了している、と出ます。順位はヒント用です。上位 100、上位 500、上位 1000、または「公開漏洩一覧」へ戻す。HIBP のような「何回出たか」の件数ではありません。

NIST SP 800-63B-4 は、開設と変更のときに、候補パスワードを「よくある、予想できる、またはすでに漏洩した」ブラックリストへ文字列全体で照合せよ、と書いています。部分文字列ではなく、複雑さ規則の重ね조차推奨しません。ローカルの高頻度一覧は、「いちばんよく当てられる一群を先に止める」層には合います。ただし一覧の体積は、攻撃者が持つ完全な辞書より小さく、HIBP が取り込み続ける漏洩ハッシュよりはるかに小さいです。2026 年 6 月、HIBP は June 2026 Stealer Logs の一回だけで、重複を除いて約 1.24 億件のパスワードを書き込みました。八百行強の公開高頻度語は 123456 は拾えます。ある社内漏洩に一度だけ出た長い文は拾いません。

HIBP のレンジ照会が送るもの、送らないもの

HIBP のパスワードページ自身が書いています。見つからなかったことは、「良いパスワードである」意味ではなく、「このサイトの索引に無い」意味だけです。レンジ照会の手順は API v3 · Pwned Passwords にあります。クライアントは先にパスワードの SHA-1(または mode=ntlm なら NTLM)を取り、先頭 5 個の十六進文字で GET https://api.pwnedpasswords.com/range/{prefix} を呼びます。サーバーはその接頭辞の下にある接尾辞と出現回数を全部返します。40 桁ハッシュの後ろ 35 桁は、この端末で照合します。

公式の規模はその場で照合できます。レンジ照会はだいたい 800 件の接尾辞を返します。接頭辞空間は 165 = 1,048,576 個で、00000 から FFFFF まで、どれも HTTP 200 を返すべきで、404 は出ません。任意ヘッダ Add-Padding: true は応答を 800〜1000 行へパディングし、傍観者が応答長から接頭辞を推測しにくくします。Cloudflare は Validating Leaked Passwords with k-Anonymity で、このレンジ照会を k-匿名と呼びます。サーバーは、漏洩していないパスワードの完全ハッシュを受け取れないので、あとからこの一回の照会だけを「解く」こともできません。

メール照会は別の道です。公式の注意どおり、メールをパスへそのまま置くとそのアドレスを HIBP へ渡します。メールを k-匿名で調べるなら、送るのはメール SHA-1 の先頭 6 文字であり、パスワードの先頭 5 文字ではありません。チケットに「HIBP で調べた」と書くときは、パスワードハッシュの接頭辞を見たのか、メールを見たのかを書いてください。プライバシーの境界も、結論も違います。

FastPwd は、上のどちらの HIBP インタフェースも呼びません。パスワード強度チェックができるのは、この端末でのエントロピー見積もりと、この公開高頻度一覧です。十億規模のハッシュ庫と照合したいときは、HIBP 公式ページか、自分で置いたオフライン副本を使い、Network でリクエスト行に五桁の接頭辞だけがあることを自分で確認してください。「安全ツールなら、代わりに HIBP を見てくれる」と思わないでください。

Network で、対象パスワードが出ていないかその場で確認する

ページ上の「アップロードしません」は証拠になりません。カナリア文字列は証拠になります。手順は「ローカル暗号化が平文を運んだか」と同型ですが、見る対象はパスワード欄と一覧ファイルです。

  1. 開発者ツールの Network を開き、Preserve log をオンにします。フィルタはまず空にして、解析の送信を見逃さないようにします。
  2. パスワード強度チェックへカナリアを入れます。例は CanaryPwd-20260902-xK9。およそ 280 ミリ秒後のローカル計算が終わるまで待ちます。
  3. リクエスト一覧でこのカナリアを検索します。リクエスト行、Query、本文、フォーム欄のどこにも出てはいけません。
  4. 同一オリジンの GET data/leaked-top10k.txt は見えるはずです。応答を開き、一行一件の公開パスワードであること、いま入れたカナリアが無いことを確認します。
  5. サイトが HIBP 連携を名乗っているなら、別に api.pwnedpasswords.com/range/ を探します。パスにあるべきなのは五桁の十六進だけで、平文は出てはいけません。

アクセス解析はあってよいです。FastPwd の監査イベントが送るのはイベント名だけです。「監査を開始した」「結果が弱い」「漏洩一覧にヒットした」などであり、入力欄の内容を引数にはしません。Network で /tj/matomo.php 向けの送信を開き、カナリアを検索して、ヒットが無いことを見てください。タブを閉じたあと、この入力は FastPwd のサーバーに残りません。ただし前提は、業務データとして一度も届いていないことです。支えるのは、いまの検索です。「ページを閉じた」では支えられません。

カナリアがどのリクエストにも出たら、結論は反転します。ボタンに「ローカル」や「プライバシー」と書いてあっても、この回の検査はパスワードをタブの外へ出しています。ツールを替えるか、この端末だけの一覧へ切り替えて、同じ手順を繰り返してください。

ヒットと未ヒットが、それぞれ支えられること

ヒットしたとき、チケットに書いてよい文は次です。「この文字列は、ページと一緒に落ちた公開高頻度一覧に、ある段階で当たった(完全一致/大小文字/末尾数字/Leet)。この端末の規則では、きわめてよくある弱いパスワードなので、変えなければならず、他サイトでも使い回さない。」書いてはいけない文は、「相手のサーバーが、何年のどの漏洩の原文だと確認した」です。この端末の一覧に事件名も出現回数もなく、あるのは順位のヒントだけです。

未ヒットのとき、書ける文はもっと短いです。「いまの公開高頻度一覧と、四段階の変形では当たらなかった。」書いてはいけない文は、「一度も漏洩していない」「このまま使ってよい」「HIBP よりきれい」です。八百行強の高頻度表は、もともと「安全の証明」用ではありません。攻撃者の散布辞書、社内の古いパスワード、一度きりの私的漏洩にだけ出た長い文は、この表にありません。

エントロピー見積もりは、三つ目の平行な情報です。ページは長さと文字種から bits を見ます。80 以上は非常に強い、60 以上は強い、40 以上は普通、それ以外は弱い。オフライン総当たりはおよそ毎秒 100 億回、オンライン制限下はおよそ毎秒 1000 回として、時間の桁を出します。8 文字未満、または内蔵のよくある弱いパスワードに当たったときは、等級は弱いへ押し下げられます。数字は相対的な強弱を比べるためのもので、カウントダウンの約束ではありません。公開一覧にヒットしたときは、エントロピーが高くても弱いへ書き換わります。辞書攻撃は、「平均の総当たり」という道を歩きません。

よくある質問

弱いパスワード一覧にヒットしなければ、一度も漏洩していない証明になりますか?

なりません。未ヒットが意味するのは、今のタブに入っている公開の高頻度一覧に対し、完全一致、大文字小文字の無視、末尾 0〜999 の除去、よくある Leet 置換のいずれでも当たらなかった、ということだけです。どの漏洩にも出ていない証明にも、Have I Been Pwned に無い証明にも、使い回してよい証明にもなりません。

Have I Been Pwned でパスワードを調べると、平文は送られますか?

公式 API に従うなら送りません。Pwned Passwords のレンジ照会が受け取るのは SHA-1 または NTLM ハッシュの先頭 5 文字だけで、返るのはおよそ 800 件の接尾辞です。完全な照合はクライアント側に残ります。平文も完全なハッシュもリクエストに出てはいけません。メールアドレスで漏洩を調べるのは別 API で、アドレスをパスに置くとそのアドレスを相手へ渡します。判断の基準は、Network で見えたその一行です。ボタンの文言ではありません。

FastPwd のパスワード強度チェックは Have I Been Pwned を照会しますか?

しません。照合するのは、ページと一緒にこの端末へ落ちる公開の高頻度弱いパスワード一覧です。対象パスワードは HTTP の業務データとして出さず、アクセス解析にも書きません。解析が記録するのは「監査を開始した」「結果が弱い/普通/強い」といったイベント名だけです。開いてすぐ使え、アカウントは不要で、検査記録を残すパスワード保存機能もありません。

エントロピーが高くても一覧にヒットしたら、強いパスワードですか?

この端末の規則では、公開の弱いパスワード一覧にヒットした時点で強制的に「弱い」になります。エントロピーが見積もるのは文字空間上の総当たりコストです。一覧が答えるのは「攻撃者の辞書に、この文字列がすでに入っているか」です。二つの問いは打ち消し合いません。NIST SP 800-63B-4 は、複雑さや定期変更ではなく、よくある/すでに漏洩したパスワードの完全一致ブラックリストを求める側に求めています。

偽パスワードで手順を最後まで歩く

計算の境界が文面に落ちているページで練習したいなら、FastPwd の パスワード強度チェック を開いてください。開いてすぐ使え、登録は不要です。先に password や qwerty123 を入れると、公開一覧へヒットし、強制的に弱いはずです。次に上のカナリアを入れると、一覧には当たらず、Network でその文字列は見つからないはずです。一覧ファイルの GET を開いて行数を数え、本文の「八百行強の高頻度語」と揃えてください。

弱いと出たら、パスワード生成 でこの端末に新しい文字列を引いてください。ランダムモードは 6〜128 文字、初期値は 16 文字、8 文字未満では安全性が低いと示します。新しいパスワードを同僚へ渡さなければならないときは、ワンタイムリンク へ切り替えてください。この端末で AES-256-GCM により暗号化し、サーバーが一時保存するのは暗号文だけ、鍵はリンクの # の後ろに残ります。完成したワンタイムリンクを、どの「オンライン漏洩チェック」入力欄へも貼り戻さないでください。

この練習の目的は、あるサイトが「絶対に安全」だと証明することではありません。検査を押す前に、同僚へ見せられる対照を手元に置くことです。今回は平文アップロードか、ハッシュ接頭辞か、この端末の短い一覧か。ヒットしたら変える。未ヒットを「一度も漏洩していない」とは書かない。同じ手順は、任意の「セキュリティスコア」や「漏洩照会」拡張でも使えます。

次に誰かがパスワードを検査欄へ入れるとき、先に三つ聞いてください。第一に、リクエストに平文または完全なハッシュがあるか。第二に、照合しているのは八百件の高頻度語か、HIBP のようなレンジ照会か。第三に、未ヒットのときチケットにどの一文を書くつもりか。繰り返せる照合だけが、自分たちのパスワード方針へ書く値打ちがあります。

関連記事

検査ページ自身が原文を出していないかを見るなら、同じカナリアでより長い Network 手順を歩いてください。ブラウザのローカル暗号化で、平文が端末を出ていないことを確認する。まとまった秘密を、検査欄ではなく人へ渡さなければならないときは、鍵を # の後ろに置ける理由と、その層が崩れる場面です。URLの#以降に鍵を置ける理由と、その保護が崩れる場面。チケットとログを AI へ貼る前の欄単位の照合は、チケットとログをAIに貼る前に、どの欄が端末を出るかを確認する です。