「パスキーを使うと、指紋や顔のデータがサービスに送られる」
指紋や顔は、端末が持ち主を確かめて秘密鍵の使用を許可するためだけに使われ、端末の外には出ません。サービスに届くのは、秘密鍵で作った署名だけです。PIN や画面ロックのパスコードでも同じようにパスキーを使えるのは、生体認証が鍵を使う許可の手段の 1 つにすぎないからです。03 パスキーの仕組みの登録とログインの流れで、何が送られるかを確かめられます。
DBC Tech Academy / セキュリティ / 入門
情報漏洩のニュースが出るたびに、サービスは「パスワードを変更してください」と告知します。漏れたパスワードは、そのサービスだけでなく、同じパスワードを使っている別のサービスでもログインに使われるからです。パスキー (passkey) では、この告知が要らなくなります。サービスが保存しているのはログインに使えない値だけで、それが漏れても攻撃者は何もできません。この講座では、パスワードとパスキーでサービス側に何が保存され、漏れたときに何が起きるかを、攻撃者の立場で確かめていきます。
上の password は、ログイン画面にそのまま入力すれば通ります。下の public_key には、入力する先がありません。同じ「漏洩」でも、攻撃者の手に渡るものがまったく違います。
01 / Start here
パスワードとパスキーを分ける軸は 1 つです。パスワードは、本人が知っている秘密の写しをサービス側にも置く。パスキーは、サービス側に秘密を置かない。漏洩したときの被害の差は、すべてこの 1 点から出ます。
パスワードのログインは、入力された文字列とサービスが保存している値を突き合わせて本人を確かめます。突き合わせるために、サービスは秘密そのものか、秘密から計算した値を持っていなければなりません。保存データが漏れれば、それが攻撃の材料になります。
パスキーのログインは、銀行の届出印に似ています。本人だけが印鑑を持ち、銀行は届け出られた印影を持っていて、書類に押された印が印影と合うかで本人を確かめます。パスキーでは印鑑にあたるものを秘密鍵 (private key)、印影にあたるものを公開鍵 (public key) と呼びます。紙の印鑑は印影から偽造されることがありますが、公開鍵から秘密鍵を作ることは、数学的に現実の時間ではできません。そのためサービスの保存データが丸ごと漏れても、攻撃者はログインに使えるものを何も手にしません。
02 / How passwords leak
パスワードが漏れたときの被害は、サービスがパスワードをどの形で保存していたかで段階的に変わります。4 つの保存方式を、漏れたデータから攻撃者が何をできるかの順に見ていきましょう。
| 保存方式 | 保存される値の例(パスワード Sakura2024!) | 漏れたとき攻撃者にできること |
|---|---|---|
| 平文 | Sakura2024! | そのままログインに使えます。強いパスワードでも関係ありません。 |
| ハッシュ値 (SHA-256 など) | 4c1e...b7a0 | 元に戻す計算はできませんが、候補を片端からハッシュ化して一致を探せます。よく使われるパスワードは短時間で割れます。 |
| ソルト付きハッシュ値 | salt=9f2c41abe03d...51c9 | 同じパスワードでも利用者ごとに値が変わり、全員分をまとめて割る手が使えなくなります。1 人ずつの総当たりは残ります。 |
| 低速なハッシュ関数 (bcrypt / scrypt / Argon2) | $2b$10$Xo3... | 1 回の計算をわざと遅くしてあり、総当たりにかかる時間が数百万倍に延びます。それでも、辞書に載るような弱いパスワードは割れます。 |
ハッシュ関数 (hash function) は、入力から決まった長さの値を計算する関数で、同じ入力からは必ず同じ値が出て、出た値から入力を逆算することはできません。サービスはパスワードの代わりにハッシュ値を保存し、ログインのたびに入力をハッシュ化して保存値と比べます。こうすれば、保存データを見てもパスワードそのものは分かりません。
ところが攻撃者は逆算する必要がありません。よく使われるパスワードの一覧(辞書)を用意し、1 つずつハッシュ化して、漏れた値と同じものを探せば済みます。SHA-256 は速く計算できるように作られた関数で、ゲーム用の GPU 1 台で毎秒 200 億回を超える計算ができます。123456 や password1 は、文字どおり一瞬で見つかります。
ソルト (salt) は、利用者ごとに作る乱数で、パスワードにつなげてからハッシュ化します。ソルトが無いと、同じパスワードの利用者は同じハッシュ値になり、1 つ割れれば同じ値の全員が割れます。ソルトがあれば、攻撃者は利用者 1 人ずつ計算をやり直すしかありません。
bcrypt・scrypt・Argon2 は、パスワードの保存専用に作られた低速なハッシュ関数で、ソルトを内部に持ち、1 回の計算に意図的に時間をかけます。正しいパスワードで 1 回ログインするには気にならない遅さでも、数十億の候補を試す攻撃者には致命的な遅さになります。
ある 1 社から漏れたメールアドレスとパスワードの組を、別のサービスのログイン画面に順に試す攻撃を、パスワードリスト攻撃 (credential stuffing) と呼びます。同じパスワードを複数のサービスで使い回していると、漏洩元とは無関係のサービスまで乗っ取られます。
攻撃は自動化されていて、漏れた組を何百ものサービスに一度に試します。漏洩元のサービスがどれだけ丁寧に保存していても、割れたパスワードを他で使っていれば、被害は使い回し先で起きます。
パスワードを忘れたときに、新しいパスワードを設定する画面ではなく、今のパスワードそのものがメールで届くサービスは、パスワードを平文か、元に戻せる形で保存しています。そのサービスに使ったパスワードは、他のどこにも使わないようにしましょう。
自分のメールアドレスが過去の漏洩に含まれているかは、漏洩データを集めて公開している Have I Been Pwned で調べられます。
試験では、パスワードの漏洩対策として「ハッシュ値で保存する」を正答とする問いがよく出ます。実務では、高速なハッシュ関数だけでは辞書との照合で割れるため、ソルト付きの低速なハッシュ関数(bcrypt・scrypt・Argon2)で保存することが求められます。OWASP の Password Storage Cheat Sheet は、Argon2 のうち総当たりと副作用の両方に備えた版である Argon2id を第一の選択肢に挙げています。
どの段に進んでも共通することがあります。サービスが「入力と突き合わせられる何か」を持っている限り、漏れたデータは攻撃の材料になります。保存方式の工夫は、割るのにかかる時間を延ばすことはできても、材料そのものを無くすことはできません。パスキーは、この材料をサービス側から無くします。
03 / How it works
パスキーは、FIDO Alliance と W3C が定めた規格 FIDO2 / WebAuthn に基づくログインの方式です。土台にあるのは公開鍵暗号 (public-key cryptography) で、ペアで作られる 2 つの鍵のうち、秘密鍵で作った署名は、ペアの公開鍵でだけ正しいと確かめられます。登録とログインの 2 つの場面で、何がどこへ送られるかを見ていきましょう。
サービスは、利用者を表す ID と、自分のドメイン(example.jp)をブラウザに渡します。
指紋、顔、または端末の PIN で、端末の持ち主がその場にいることを確かめます。
このサービス専用の秘密鍵と公開鍵を作ります。秘密鍵はドメイン example.jp と結びつけて端末の中に保存します。
サービスは公開鍵と、鍵を見分ける credential ID を保存します。ヒーローのテーブルの public_key がこれです。
チャレンジ (challenge) は、ログインのたびに新しく作る使い捨ての乱数です。
今開いているページのドメインを見て、そのドメインに結びついたパスキーだけを候補に出します。
指紋や顔で確かめたあと、秘密鍵でチャレンジとドメインにデジタル署名 (digital signature) して返します。
保存している公開鍵で署名が正しいかを確かめ、合えばログインさせます。チャレンジは捨てます。
実際の通信では、署名の対象にチャレンジのほか、サイトのドメインのハッシュ値、本人確認をしたかどうかの印、署名の回数(sign_count)がまとめて含まれます。
この流れで、サービスの手元に残るのは公開鍵と credential ID だけです。公開鍵でできるのは「この署名は、ペアの秘密鍵で作られたか」を確かめることだけで、署名を作ることはできません。パスキーで広く使われる楕円曲線暗号 ECDSA P-256 では、公開鍵から秘密鍵を求める計算に、現在の計算機を総動員しても宇宙の年齢を大きく超える時間がかかります。
チャレンジが毎回変わることにも意味があります。通信を盗み見て署名を記録しても、その署名は記録した回のチャレンジに対するもので、次のログインでは別のチャレンジが来るため使えません。紙の書類に押した印影をコピーしても、次の書類には使えないのと同じです。
鍵ペアはサービスごとに別々に作られます。サービス A に登録した公開鍵は、サービス B のどこにも登録されていません。パスワードの使い回しにあたるものが、仕組みの上で起こりません。
指紋・顔・PIN は、端末が「持ち主が今ここにいる」と確かめ、秘密鍵の使用を許可するために使われます。生体情報も PIN も端末の外へは出ず、サービスに届くのは署名だけです。パスキーを実際に持ち、署名を作る装置(スマートフォン、パソコン、セキュリティキー)を、規格では認証器 (authenticator) と呼びます。
このため、指紋が登録されていない端末でも、PIN や画面ロックのパスコードでパスキーを使えます。生体認証は鍵を使う許可の手段の 1 つです。
ヒーローのテーブルにある sign_count は、認証器が署名するたびに増える回数です。サービスは前回より小さい値が届いたら、鍵が複製された兆候として扱えます。端末間で同期するパスキー(06 秘密鍵の置き場所と同期)では 0 のまま送られることが多く、サービス側の点検項目の 1 つという位置づけです。
試験で扱うチャレンジレスポンス認証は、サーバーが送ったチャレンジとパスワードを組み合わせてハッシュ値を計算し、返す方式です。サーバーも同じ計算をして照合するので、サーバー側もパスワード(またはそれに相当する値)を持っています。パスキーもチャレンジに応答する方式ですが、応答がデジタル署名で、サーバー側が持つのは公開鍵だけという点が違います。同じ「チャレンジレスポンス」でも、漏洩時の結果は02 パスワードの保存方法と漏洩の表と05 漏洩シミュレーターのように分かれます。
04 / Phishing
漏洩と並んで、パスワードが攻撃者に渡るもう 1 つの経路がフィッシング (phishing) です。本物そっくりの偽サイトに誘導し、利用者自身にパスワードを入力させます。パスキーは、この経路にも強い仕組みを持っています。
03 で見たとおり、パスキーは登録したサイトのドメインに結びついています。偽サイト examp1e.jp(l の代わりに数字の 1)でログインしようとしても、ブラウザはそのドメイン用のパスキーを持っていないので、候補自体が出ません。利用者が偽サイトだと気付かなくても、渡すものがありません。
パスワードでは、偽サイトかどうかを見分けるのは人間です。アドレスバーの 1 文字の違いを見落とした時点で、入力したパスワードは攻撃者に渡ります。パスキーでは、ドメインの照合をブラウザが行います。利用者の注意力に頼らないことが、パスキーがフィッシングに強いと言われる理由です。
SMS や認証アプリの 6 桁のワンタイムパスワードを組み合わせる二要素認証も、偽サイトには破られます。偽サイトがパスワードと 6 桁のコードを受け取り、有効期限の 30 秒ほどのうちに本物のサイトへ転送してログインする手口で、リアルタイムフィッシングと呼ばれます。パスキーの署名には相手のドメインが含まれるので、偽サイトが受け取った署名を本物へ転送しても検証に通りません。
いつもパスキーでログインしているサービスで、パスキーの候補が出ずにパスワードの入力欄だけが出たときは、そのページのドメインを疑いましょう。メールや SMS のリンクから開いたページなら、なおさらです。
候補が出ない理由には、別の端末を使っている、パスキーを登録していないブラウザを開いている、といった無害なものもあります。どちらか迷ったら、リンクからではなく、ブックマークや公式アプリからサービスを開き直します。
05 漏洩シミュレーターの後半で、本物と偽サイトのそれぞれでパスワード・ワンタイムパスワード・パスキーを試せます。
05 / Simulator
架空のサービス A の利用者テーブルが漏洩しました。あなたは攻撃者の立場で、漏れたデータを使ってログインを試します。 保存方式を切り替えて攻撃を実行し、割れた利用者と、同じパスワードを使い回していたサービス B での被害を確かめてみましょう。ハッシュの照合とパスキーの署名は、このページの中で実際に計算しています。
サービス A の保存方式
攻撃
辞書は、よく使われるパスワードと日本の名前・地名など 76 語に、先頭の大文字化、末尾の数字・西暦・記号を組み合わせた約 2 万語です。実際の攻撃では、過去の漏洩から集めた数十億語の辞書が使われます。
所要時間は、GPU 1 台(NVIDIA RTX 4090)の hashcat 公開ベンチマーク(SHA-256 毎秒約 220 億回、bcrypt コスト 10 で毎秒約 5,700 回)から計算しています。攻撃者が GPU を 100 台そろえれば、所要時間は 100 分の 1 になります。
パスワード
ランダムに作ったパスワードを、すべての組み合わせを試して割るまでの時間です。辞書に載る語や名前と誕生年の組み合わせは、長さに関係なく上の漏洩シミュレーターのとおり短時間で割れます。
上と同じ GPU 1 台のベンチマークで、すべての組み合わせを試し終えるまでの時間を出しています。ソルト付きの方式は利用者 1 人あたりの時間で、全員を割るには人数分かかります。
開いたページ
ログインの方式
偽サイトのドメインと画面は説明のための架空のものです。実際の偽サイトは、ロゴ・配色・文言まで本物を写し取っていて、画面だけでは見分けられません。
平文では、強いパスワードも弱いパスワードも同じく全員が使われます。12 文字のランダムなパスワードを使っていた利用者も、サービス B で同じものを使っていれば一緒に乗っ取られます。平文保存のサービスに対して利用者ができるのは、使い回さないことだけです。
ハッシュ化すると、守られるのは強いパスワードだけです。SHA-256 でも bcrypt でも、辞書に載る 4 人は割れました。違いが出るのは総当たりの時間で、ランダムな 8 文字(英大小文字と数字)は SHA-256 なら数時間で、bcrypt なら千年を超えます。保存方式が効くのは、パスワードが辞書に載らない場合に限られます。
パスキーでは、漏れた公開鍵で署名を作ろうとすると、ブラウザの暗号機能そのものが拒否します。でたらめな署名は検証に通らず、サービス B には別の鍵ペアが登録されているので試す相手もいません。利用者のパスワードの強さや使い回しの癖と関係なく、漏洩がログインの被害につながりません。
偽サイトでは、パスワードもワンタイムパスワードも攻撃者に渡り、パスキーだけが候補を出しません。利用者が偽サイトに気付いたかどうかは、結果に関係しません。
06 / Where the key lives
パスキーの安全性は、秘密鍵が本人の手元から出ないことで成り立っています。では、その秘密鍵はどこに置かれ、機種変更や端末の紛失のときにどうなるのでしょうか。置き場所の違いで、パスキーは 2 種類に分かれます。
iCloud キーチェーン、Google パスワードマネージャー、1Password などのパスワード管理の仕組みが、秘密鍵を暗号化したまま、同じアカウントでサインインしている他の端末へ同期します。暗号化はエンドツーエンドで行われ、同期を運ぶ事業者にも中身は読めません。
機種変更しても、新しい端末で同じアカウントにサインインすればパスキーが戻ってきます。そのかわり、同期先のアカウント(Apple アカウント、Google アカウント、パスワード管理アプリのアカウント)を乗っ取られると、そこに入っているすべてのパスキーに手が届きます。
今の一般向けのパスキーは、ほとんどがこの形です。
USB や NFC でつなぐセキュリティキー(YubiKey など)の中に秘密鍵があり、キーの外へは一切出ません。同期されないので、そのキーを物理的に持っている人しかログインできません。
紛失すると、そのキーのパスキーは使えなくなります。1 本目を登録するときに、2 本目のキーか、別の端末の同期パスキーも登録しておきます。
管理者アカウントや、同期先のアカウントそのものを守るのに向いています。
パスキーを登録していないパソコンでログインするときは、パソコンの画面に出る QR コードをスマートフォンで読み取り、スマートフォンのパスキーで署名する方法が使えます。このとき、パソコンとスマートフォンが Bluetooth で互いに近くにあることを確かめるので、離れた場所にいる攻撃者が QR コードを写真で送ってきても、それを読み取ってログインさせられることはありません。
端末の中で秘密鍵を守るのは、iPhone や Mac の Secure Enclave、Windows パソコンの TPM のような、OS からも中身を直接読めない専用の領域です。秘密鍵を取り出すには、端末の画面ロックを解除できることが前提になります。
登録済みのパスキーは、iPhone と Mac では「パスワード」アプリ、Android と Chrome では Google パスワードマネージャー、Windows では「設定」の「アカウント」から「パスキー」で一覧できます。どのサービスのパスキーが、どのアカウントに同期されているかを一度見ておきましょう。
FIDO(生体情報を端末の外に出さず、公開鍵で認証する方式)は、情報セキュリティマネジメント試験や基本情報技術者試験でも出題されます。試験の説明は、秘密鍵が 1 台の端末に閉じている前提で書かれていることがほとんどです。実務のパスキーは同期で端末をまたぐのが標準で、そのぶん同期先アカウントの守りが、すべてのパスキーの守りになります。
07 / What remains
パスキーが守るのは、ログインの瞬間と、サービス側の保存データです。攻撃者は、守りの固い入口を避けて、最も弱い入口を選びます。パスキーに切り替えたあとに残る入口は 4 つあり、それぞれ別に守る必要があります。
パスキーを失った利用者のために、サービスはメールのリンクや SMS のコードでアカウントを取り戻す手段を用意しています。攻撃者がメールアカウントを乗っ取ったり、携帯電話番号を自分の SIM に移し替えたり(SIM スワップ)すれば、パスキーを通らずにアカウントに入れます。復旧手段の強さが、アカウント全体の強さになります。
確かめ方:各サービスの「パスキーを使えない場合」「ログインできない場合」の手順を自分でたどり、どの連絡先に何が届くかを見ます。届く先のメールアカウントもパスキーで守ります。
パスキーを追加しても、多くのサービスではパスワードでのログインも有効なまま残ります。そのパスワードが弱いか使い回しなら、02 パスワードの保存方法と漏洩の被害はそのまま残ります。
確かめ方:Microsoft アカウントのようにパスワードを削除できるサービスでは削除します。削除できないサービスでは、パスワード管理アプリで生成した長いランダムなものに変え、他では使いません。
パスワードを削除する前に、2 つ目のログイン手段を登録しておきます。パスキーが 1 台の端末にしか無い状態でパスワードを削除すると、その端末を失ったときに自分でもログインできなくなります。別の端末かセキュリティキーでも登録してから削除します。
06 秘密鍵の置き場所と同期のとおり、同期パスキーは同期先のアカウントに集まっています。ここを乗っ取られると、すべてのパスキーが攻撃者の端末に同期されます。
確かめ方:Apple アカウントや Google アカウントのセキュリティ設定で、ログイン方法と復旧手段、ログイン中の端末一覧を確かめ、知らない端末があればサインアウトさせます。
ログインが済むと、ブラウザはログイン状態を Cookie に保存します。インフォスティーラーと呼ばれるマルウェアや、悪意のあるブラウザ拡張機能がこの Cookie を盗むと、攻撃者はパスキーを通らずにログイン済みの状態を使えます。パスキーが守るのはログインの瞬間までです。
確かめ方:OS とブラウザを最新に保ち、出どころの分からないソフトや拡張機能を入れないようにします。重要なサービスでは、ログイン中の端末の一覧を時々確かめます。
08 / In practice
ここまでの内容を、パスキーを使い始めるときの手順にまとめます。前半は利用者として、後半はサービスを運営する側として確かめることです。
同期先のアカウント(Apple・Google)、メール、金融、業務の管理者アカウントの順に登録します。メールが乗っ取られると、他のサービスの復旧手段が使われるからです。
別の端末か、セキュリティキーでも登録し、1 台を失ってもログインできる状態にします。
削除できるサービスでは削除し、できないサービスでは長いランダムなものに変えて使い回しをやめます。削除は、手順 2 の 2 つ目の手段を登録してから行います。1 台しか無い端末を失うと自分でも入れなくなるからです。
登録しているメールアドレスと電話番号が今使っているものかを確かめます。
パスキーの候補が出ずにパスワードを求められたら、入力する前にドメインを確かめます。
サービスを運営する側は、次の 3 点を確かめましょう。
1 つ目は、今のパスワードの保存方式です。平文や、元に戻せる暗号化、ソルトの無いハッシュ値で保存しているなら、パスキーの導入より先に是正の対象です。次に利用者がログインしたときに、入力されたパスワードを Argon2id か bcrypt で保存し直す形で移行できます。
2 つ目は、パスキーを登録した利用者が、パスワードを削除できるかです。パスキーを追加してもパスワードのログインが残るなら、利用者にとっての攻撃口は減っていません。パスキーの登録後にパスワードを削除する選択肢を用意します。
3 つ目は、復旧手段がパスキーより弱い入口になっていないかです。メール 1 通で誰でもパスキーを登録し直せる作りなら、攻撃者はそこを通ります。復旧のときに、登録済みの別のパスキーや、本人確認書類の確認を求める段を設けます。
パスキーを保存するテーブルには、ヒーローのテーブルのように credential ID・公開鍵・sign_count を利用者ごとに複数行持たせます。1 人が複数の端末やセキュリティキーを登録するので、利用者と鍵は 1 対多になります。
09 / Read the symptom
家族や同僚から持ち込まれる相談です。いずれも理解のための架空の状況です。何が起きていて、何をすべきかを考えてみましょう。
10 / Myth vs. reality
どれももっともらしく、セキュリティに詳しい人ほど口にしがちな判断です。
指紋や顔は、端末が持ち主を確かめて秘密鍵の使用を許可するためだけに使われ、端末の外には出ません。サービスに届くのは、秘密鍵で作った署名だけです。PIN や画面ロックのパスコードでも同じようにパスキーを使えるのは、生体認証が鍵を使う許可の手段の 1 つにすぎないからです。03 パスキーの仕組みの登録とログインの流れで、何が送られるかを確かめられます。
ハッシュ化は、パスワードをそのまま読まれることを防ぐだけで、辞書との照合は防げません。123456 や名前と誕生年のようなパスワードは、bcrypt で保存されていても割れます。保存方式が効くのは、辞書に載らない強いパスワードを、他で使い回していない場合です。05 漏洩シミュレーターで、保存方式を切り替えても割れる利用者が変わらない様子を確かめられます。
パスキーが守るのは、ログインの瞬間とサービス側の保存データです。アカウント復旧の手段、残したパスワード、同期先のアカウント、ログイン後のセッションは、それぞれ別に守る必要があります。攻撃者は最も弱い入口を選ぶので、パスキーを入れたあとは、残りの入口の強さがアカウントの強さになります。07 パスキーでも残る攻撃口の確かめ方を一度たどってみましょう。
11 / Knowledge check
答えを当てるだけでなく、なぜそう判断できるのかを説明できれば合格です。
選択肢を1つ選んでください。
Take it home
パスワードは、本人とサービスが同じ秘密を知っていることで本人を確かめます。だからサービスの保存データが漏れると、保存の仕方によってはその秘密が攻撃者に渡り、使い回し先のサービスまで乗っ取られます。保存方式の工夫は、割るまでの時間を延ばせても、材料を無くすことはできません。
パスキーは、サービス側に秘密を置かないことで、漏洩とフィッシングの 2 つの経路をまとめて閉じます。サービスが持つのは公開鍵だけで、署名はドメインとチャレンジに結びついています。切り替えたあとは、復旧手段、残したパスワード、同期先のアカウント、ログイン後のセッションという残りの入口を、08 使い始めるときに確かめることの手順で確かめていきましょう。
参考資料
目次