パスワード329件の片付けが、AI時代の自己防衛に行き着いた話

パスワードの重複や漏洩を直さないといけない、という自覚はずっとあった。ただ面倒すぎて、見て見ぬふりをしていた。覚悟を決めてChromeのパスワードチェックを開いたら、こう出た。

  • 不正使用されたパスワード: 40件
  • 使い回されているパスワード: 132件
  • 脆弱なパスワード: 109件

確認した総数は329件。気が遠くなる数字だ。やっぱり見なきゃよかった、と一瞬思った。しかも見ていくと、もう使っていないサービスや、とっくに退会したものも混じっている。さて、どうするのが効率的で安全か。これを片付けた一日の記録と、片付けながら考えたことを残しておく。

全部は直さない

最初に結論を言うと、「全部直す」を目標にしないのが正解だった。329件を律儀に一つずつ直すのは、数日かかるうえに途中で心が折れる。やるべきは、リスクの高い順に削ることだ。

数字の読み方を間違えないようにしたい。今すぐ危ないのは「漏洩40件」だけだ。使い回し132と脆弱109は、漏洩と重ならない限り、今この瞬間に誰かに入られるわけじゃない。だからまず漏洩40件のドメインだけを見る。

その40件を、こういう物差しで4階層に振り分けた。一番上が生命線。メール本体、Apple/Googleアカウント、携帯キャリアあたりで、乗っ取られると他のすべての復旧経路になるやつだ。次が金の動くもの。銀行、決済、Amazon、電力や通信の契約。その下に本人性の高いもので、主要SNSや仕事ツール。一番下が末端で、一度きりのECや、もう使わない会員登録だ。

振り分けの軸は「乗っ取られたら、他のアカウントまで芋づる式に危ないか」。メールは芋づるの親玉なので必ず生命線、という具合だ。

実際に振り分けてみると、漏洩40件の大半は末端だった。手を動かす必要がある上の二階層は10件ちょっと。さらに、片付けの途中で対応すら不要なものが次々に出てきた。Amazonだと思っていた漏洩は、ログインしようとしたら「初めてのご利用のようです」と出た。アカウントがもう存在しない、ゾンビの認証情報だった。存在しないものは乗っ取りようがない。スカパーは解約済み、前職のBitbucketやSlackは死んでいる。これらは全部「削除するだけ」で済む。

漏洩40件のうち、本当に手をかけたのは実質10件くらいだった。リスクの8割は、ここを潰せば消える。

パスワードは覚えない

片付けながら、登録メールが死んでいるアカウントがいくつか出てきた。昔使っていた独自ドメインのメールアドレスで、そのドメインはもう失効している。これは地味に怖い。誰かがそのドメインを取り直せば、パスワードリセットのメールを受け取れてしまう。幸い紐付いていたのは低価値なアカウントだけで実害はなかったが、ヒヤリとした。

こういう棚卸しを手作業でやり続けるのは無理がある。Chromeで一つずつ直しても、半年後にまた同じ画面を見ることになる。根本の問題は「人間が手で管理しきれていない」ことだ。

だから、パスワードは人間が覚えるものじゃない、という前提に切り替える。専用のパスワードマネージャに全部預けて、サービスごとに固有のランダムな値を自動生成させる。これだけで「使い回し」は二度と増えない。今回、Chromeに溜まっていた329件をまるごとマネージャに移して、Chrome側の保存はオフにした。

それでも覚えないといけないパスワード

ただ、どうしても人間が覚えておかないといけないパスワードも残る。PCのログインパスワード、パスワードマネージャ自体のマスターパスワード。これらはマネージャの中に入れられない。自分自身の鍵だからだ。

この「覚える数個」のベストプラクティスはちゃんとある。

まず数を絞る。覚えるべきは2〜4個まで。それ以外は全部マネージャの裏に隠す。

そして、覚える数個はパスフレーズにする。P@ssw0rd! みたいな記号ぐちゃぐちゃの短いやつは、人間にも厳しいし強度も低い。正解はランダムな単語を並べたものだ。correct-horse-battery-staple のような形式で、4〜6単語。強さは「長さ×ランダムさ」で決まるので、6単語あれば総当たりは実質不可能になる。覚えやすく、スマホでも打ちやすい。ポイントは、自分で考えた単語じゃダメだということ。必ずサイコロや乱数で選ぶ。

マスターパスワードだけは物理サイコロで作るのが理想だ。これは一度もデバイスに触れさせたくない最高機密なので、端末側が汚染されていても安全な作り方をする。作ったら紙に書いて金庫や封筒で物理的に保管する。デジタルには残さない。唯一の復旧経路だから、ここだけはアナログが正しい。

とはいえ、俺自身はパスフレーズを使っていない。生成器が吐いたランダムな文字列を、無理やり暗記するという力技でやっている。毎日打っていれば手が覚える、という雑な理屈だ。ベストプラクティスとしてはパスフレーズを勧めるけど、自分の指はもう記号混じりの呪文を覚えてしまった。今さら変える気力もない、というのが正直なところ。

なぜ漏洩は起きるのか

そもそも、なぜパスワードは漏れるのか。

今回の40件は全部「データ侵害で漏洩」、つまりサービス側のデータベースが流出したものだった。これは自分には防ぎようがない。サービスが破られるかどうかの話だ。流出したあとパスワードがどうなるかは、保存方法で決まる。平文で保存していれば丸見え。弱いハッシュ(MD5など)だと、ありがちなパスワードは一瞬で割られる。MD5は計算が速いうえにsaltを付けていないことも多く、辞書や使い回しリストとの照合が桁違いに速いからだ。強いハッシュにsaltを足してあれば困難になるが、それでも弱いパスワードは破られる。結局、割れるかどうかはパスワードの強さ次第なところがある。

そして本当の被害は、その次に起きる。一つのデータベースが漏れると、攻撃者はそのメールとパスワードの組を、他のサイトで片っ端から試す。使い回していると、芋づる式に陥落する。クレデンシャルスタッフィングと呼ばれるやつだ。漏洩そのものより、この連鎖が実害の正体だ。だから固有パスワードにする意味がある。1か所漏れても、他に飛ばない。

漏洩経路はこれだけじゃない。偽サイトに自分で入力してしまうフィッシング、PCに入り込んでブラウザ保存のパスワードを丸ごと抜くマルウェア(インフォスティーラー)。近年はこの最後のやつが厄介で、ブラウザに保存しない理由の一つでもある。

整理すると、漏洩自体は止められない。止められるのは連鎖のほうだ。固有パスワードと2FA、できればパスキーを敷いておけば、1か所漏れても被害が他に広がらない。実際、今回40件漏れていても、メール本体に2FAがある時点で芋づるは起きない状態になっていた。

ついでに、あの理不尽な制限の話

棚卸しをしていると、「この記号は使えません」「16文字までです」みたいな縛りに何度もぶつかる。あれは何なのか。

ほとんどがセキュリティのためじゃなく、裏側の作りが古い・雑なサインだ。

まともなサイトはパスワードをハッシュ化して保存する。ハッシュは入力が何文字でも出力が固定長になる。だから「最大16文字まで」という上限は理屈に合わない。上限があるということは、平文や固定長カラムに保存している疑いがある。記号禁止も、SQLインジェクションを恐れた素人対策であることが多い。正解は危険な文字を禁止することじゃなく、パラメータ化クエリとハッシュ化なのに、文字を禁止している時点で対策がズレている。

「大文字+数字+記号を必ず含めろ」というルールも、もう時代遅れだ。これは2017年より前の古いガイドラインの名残で、現行のNIST SP 800-63Bは方針を逆転させた。構成ルールは課すな、定期的な強制変更もやめろ、長いパスフレーズを許可しろ、代わりに漏洩リストとの照合で弱いものを弾け、と。構成ルールは人間に Password1! を量産させるだけで、むしろ弱くなっていた。

要するに、あの縛りは「このサイト、パスワードの扱いが怪しいかも」のヒントだ。当たったら、そこは特に固有パスワードにしておけばいい。

このあたりの新しい考え方をもっと詳しく知りたい人は、そのパスワードポリシーは時代遅れ?NIST SP 800-63Bで読み解く最新認証の考え方(LAC)がよく整理されている。参考まで。

同じ問題は、パスワードの外にもある

パスワードの片付けは、技術的には固有化と2FAでだいたい解決する。でも一日やってみて、自分が何度も同じことをしていたのに気づいた。固有パスワードも、2FAも、パスキーも、突き詰めると「目の前に出されたものを、そのまま信じない」という一点に行き着く。パスワードは漏れる前提で1か所ごとに分けておき、本人確認はパスワード単体じゃなく別の要素(2FA)に預ける。信用の置きどころを、見えているものからズラしているわけだ。

この考え方は、パスワードの外でもそのまま効く。むしろ外のほうが切実だった。まずはメールから。

フィッシングメールは「◯◯しないといけません」と急かしてくる。送信元のアドレスを偽装されたら気づきにくいんじゃないか、と思う。実際、表示名だけの偽装は簡単だ。差出人欄に「Amazonカスタマーサービス」と表示しておいて、実アドレスは別物。スマホのメールアプリは表示名しか見せないことが多いので、ここで引っかかる。

ドメインそのものを正面から騙るのは、今は実は難しい。受信側がSPF・DKIM・DMARCという仕組みで検証していて、大手はこれを厳格に運用しているからだ。なので攻撃者は「似ているドメイン」に逃げる。paypa1.com(lをiに)とか、amazon.co.jp.verify-login.com みたいなサブドメイン詐欺とか。これらは攻撃者自身の正規ドメインなので検証は通る。通るが、中身は偽物だ。

人間が毎回これを見破るのは無理がある。だから、送信元を見破る勝負をしないことにする。リンクを踏まず、自分でブックマークやマネージャからアクセスする。パスキーならドメインに紐付くので偽サイトでは反応しない。パスワードマネージャは正規ドメインでしか候補を出さないので、「ログイン画面のはずなのにマネージャが沈黙する」のがそのまま偽サイトの警報になる。

声も、信じない

そして、ここにAIが乗ってくる。

AIは「下手な日本語」「いかにも怪しい」という、これまでの見破りポイントを全部消した。完璧な文章、本人そっくりの声、偽のビデオ通話。誤字を探す式の対策はもう効かない。声のクローンは数秒の音声で作れるし、これからもっと本人と区別がつかなくなる。

じゃあ一般の人ができる自己防衛はあるのか。ある。しかもタダで、簡単に。

一番効くのは、家族で合言葉を一つ決めておくことだ。「事故った、今すぐ金が要る」と本人そっくりの声で電話が来たら、「合言葉は?」と聞く。クローンした声がどれだけ完璧でも、家族の食卓で口頭で決めた秘密までは盗めない。

ここが肝なんだけど、合言葉が試しているのは「声が本物か」じゃない。「この秘密を知っているか」だ。だから声のクローン精度が100%になっても、この防御は劣化しない。「声の聞き分け勝負」から「知識の有無」に土俵を移しているからだ。

これは、今回パスワードでやったことと同じ発想だった。その場で見せられるもの(声・顔・送信元)を信用せず、事前に共有した秘密や別の経路で確認する。

使うときの注意も同じだ。必ず自分から聞いて、相手に答えさせる。「合言葉って“やまびこ”だっけ?」とこっちから言ってはいけない。言ったら盗まれる。答えられなければ、一旦切って、知っている番号にかけ直す。合言葉と「かけ直し」をセットにすれば、片方を破られてももう片方が残る。

合言葉は、推測されにくい言葉にする。誕生日やペットの名前みたいに調べたら分かるものはダメだ。意味のない単語2つの組み合わせがいい。あと、これは自分より先に親と決めておくといい。狙われやすいのは本人より親世代だから。「変な電話が来たら合言葉を聞け。答えられなきゃ偽物だから切れ」と一言伝えておくだけで、AI声クローン詐欺の大半を止められる。

結局、同じ原則だった

一日かけてパスワードを329件棚卸しして、最後に行き着いたのはこれだった。

漏洩は止められない。声も顔も送信元も偽装される。だから「その場で見せられるもの」を判断材料から外す。代わりに、事前に共有した秘密(固有パスワード、合言葉)と、別の経路(2FA、かけ直し)に判断を逃がす。

本人確認を見た目から事前の秘密・別の経路へ移す対応表。ログインは「ログイン画面・送信元(URLは似せられる)」を信じず固有パスワード+2FA・パスキーへ。メールは「差出人の名前・ドメイン(表示名や似せドメインで化ける)」を信じず自分でアクセス。電話の声は「本人そっくりの声(AIのクローンで作れる)」を信じず合言葉+知ってる番号にかけ直す

パスワードの固有化も、2FAも、家族の合言葉も、全部この一つの原則の現れだった。雑用のつもりで始めた片付けが、AI時代の自己防衛の輪郭を描いてくれた、という話。

まず家族で合言葉を決めるところから始めるのがいいと思う。技術もお金も要らないし、これが一番折れない。

それにしても、だ。合言葉なんて、古代ローマの歩哨が夜の陣営で誰何に使っていたような大昔の手口だ。それが、声まで完璧に偽造できる時代に、最先端の詐欺を止める手段としてそのまま蘇ってくる。技術がどれだけ進んでも、最後に効くのが二千年前の知恵だというのは、とてもおもしろい。