パスキーはなぜ安全なのか ── 図解でわかる「秘密を送らない認証」の仕組み

· 更新日: · · パスキー, WebAuthn, FIDO2, セキュリティ, 認証, フィッシング対策, 情報システム

更新履歴(3件・最終更新 2026年08月02日)

この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。

知識マップのエッジのうち、一般概念に本記事固有の実装選択が結び付いていたものを条件付き(context-dependent)に改めました。機械可読データで「その技術は一般にそうである」と読める主張になっていたためです。本文の説明は変えていません。
記事の冒頭に「この記事の知識マップ」を追加しました。本文で扱う概念どうしの関係を一枚の図で見渡せます。関係の全一覧(根拠のURL・確度・確認日つき)と主要概念の定義は知識マップ詳細ページにまとめ、機械可読データをJSON-LDとTurtleで公開しています。
WebAuthn・CTAP・FIDO2・パスキーの関係を1章末の表に整理し、同期型とデバイス固定型の早見表を5章の冒頭へ前倒ししました。あわせてWebAuthn APIの主要パラメーターの表と、HTTPSが必要でlocalhostだけが例外という検証環境の注記を追加しています。
初版公開
この記事を引用する(DOI: 10.5281/zenodo.21739482)

この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。

小村 豪(2026)「パスキーはなぜ安全なのか ── 図解でわかる「秘密を送らない認証」の仕組み」合同会社小村ソフト. https://doi.org/10.5281/zenodo.21739482 https://staging.comcomponent.com/blog/passkey-why-secure/

DOI(最新版)
10.5281/zenodo.21739482
DOI(この版)
10.5281/zenodo.21739483

「また大手サービスからパスワードが漏れた」というニュースは、もう誰も驚かなくなりました。フィッシング訓練を毎年やっても、引っかかる人はゼロにはなりません。「パスワードは使い回すな、長くしろ、定期変更は…もうしなくていい」──言うことも二転三転してきました。

ここ数年で急速に広まったパスキー(passkey)は、この状況への答えとして、Apple・Google・マイクロソフトの3社が揃って推進している認証方式です。1 「指紋や顔でログインできて便利」という紹介のされ方が多いのですが、本質はそこではありません。パスキーの本当の価値は、安全性の根拠を「人間の注意力」から「プロトコルの構造」に移したことにあります。

  • パスワードが漏れるのは利用者の不注意だから、教育しよう → 人間は必ず間違える
  • 偽サイトを見抜けるように訓練しよう → 見抜けない偽サイトが作れる
  • パスキーなら → そもそも送る秘密がなく、偽サイトでは署名が成立しない

この記事では、パスキーがなぜ安全なのかを、パスワードの何が壊れているのかから出発して図で押さえます。そのうえで「同期されるパスキーは本当に安全なのか」「弱点はないのか」という当然の疑問に正面から答え、最後にWebアプリやWindows環境へ導入するときの実務の要点を整理します。

1. まず結論

パスキーが安全な理由は、次の3つに集約されます。

  1. サーバーに秘密が存在しない。サーバーが保存するのは公開鍵だけで、これは漏れても悪用できない情報です。データベースが丸ごと流出しても、攻撃者が持ち帰れる「なりすましの材料」がありません。2
  2. 秘密がネットワークを流れない。ログイン時に送られるのは、その場限りの乱数(チャレンジ)への署名だけです。秘密鍵はデバイスの認証器から一切出ないため、経路のどこを盗聴・中継しても秘密は手に入りません。2
  3. 偽サイトでは署名が成立しない。パスキーはサイトのドメインに紐付いており、ブラウザーがドメインの照合を強制します。利用者が偽サイトに騙されても、本物のサイト用のパスキーはそもそも候補に出ず、仮に署名を中継しても検証で落ちます。3

この3つは独立した工夫ではなく、「秘密を共有して送る」認証から「秘密を持っていることを署名で証明する」認証への転換という1つの設計変更から、すべて導かれる帰結です。順に見ていきます。

用語の関係 ── パスキー・WebAuthn・FIDO2・CTAP

この分野は用語が多いうえ、記事によって指す範囲が違うので、先に関係だけ押さえておきます。パスキーは新しいプロトコルではなく、既存の規格の組み合わせに付いた「呼び名」です。21

用語 正式名称 何を指すか
WebAuthn Web Authentication API(W3C勧告) ブラウザーとWebサイトの間の規格。navigator.credentials で鍵ペアの作成と署名を要求するAPI
CTAP Client to Authenticator Protocol(FIDOアライアンス) ブラウザーと外付け認証器の間の規格。USB・NFC・Bluetooth越しにセキュリティキーやスマホと話す部分
FIDO2 上の2つを合わせた枠組みの総称。FIDO2 = WebAuthn + CTAP
パスキー(passkey) FIDO2の資格情報のうち、パスワードの代わりに単体でログインできるもの(ディスカバラブル資格情報)の呼び名

表1: パスキーはFIDO2という土台の上の呼び名であり、規格名ではない

つまり「パスキーに対応する」とは、実装の言葉に直せば「WebAuthnを実装する」ことです。CTAPは外付けの認証器を使うときにブラウザーとOSが面倒を見てくれる層なので、Webアプリを作る側が直接触ることはありません。

この記事の知識マップ

パスキーはWebAuthnとCTAP(合わせてFIDO2)という標準規格の上に成り立つ公開鍵暗号ベースの資格情報で、秘密鍵は認証器から出ず、サーバーには漏れても悪用できない公開鍵だけを預けます。パスキーがサイトのドメイン(RP ID)に紐付けて作られることで、偽サイトでは署名がそもそも成立せずフィッシングが構造的に防止されます。同期型パスキーはクラウドアカウントへの依存と引き換えに紛失耐性を得る一方、デバイス固定型はハードウェアに鍵を閉じ込めます。パスキー導入後は、併存するフォールバック手段の縮小とアカウント回復フローの強化が実務の焦点になります。

パスキーがなぜ安全かの知識マップパスキーがWebAuthn・FIDO2・CTAP・公開鍵暗号の上に成り立つこと、RP IDによるドメイン紐付けがフィッシングを構造的に防ぐこと、同期型とデバイス固定型の違いとそれぞれの単一障害点、フィッシング耐性MFAとしての位置付け、残存リスク(フォールバック・アカウント回復・セッション窃取)の関係を示す図利用する利用する利用する利用する利用する利用する利用する利用する利用する利用する利用する前提とする利用する前提とする防止する防止する防止する軽減する原因になり得る原因になり得る原因になり得る原因になり得る原因になり得る用いるのは非推奨推奨される対応利用するで構成できるに保存される両立しない推奨される対応原因になり得る推奨される対応原因になり得る推奨される対応原因になり得る推奨される対応原因になり得る用いるのは非推奨パスキーWebAuthnFIDO2公開鍵暗号CTAP認証器TPMWindows Helloセキュリティキーデバイス固定型パスキーセキュアコンテキスト要件(HTTPS)チャレンジ(使い捨て乱数)RP ID(Relying Party識別子)フィッシングAiTM(中間者)型フィッシング認証情報データベースの漏洩パスワード認証パスワードの使い回し(リスト型攻撃)アカウント乗っ取りセッションクッキー窃取ワンタイムパスワード(TOTP)フィッシング耐性MFAMicrosoft Entra ID同期型パスキープラットフォームの資格情報保管庫NIST AAL3(認証器保証レベル3)プラットフォームアカウントの保護強化アカウント回復フローの悪用回復フローの本人確認強化併存するフォールバック認証手段フォールバック手段の計画的縮小

図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全38件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle

2. パスワード認証は何が壊れているのか

パスキーの安全性を理解する近道は、パスワードの弱点を「場所」で捉えることです。パスワード認証では、秘密そのものが認証のたびに全区間を旅します

サーバーブラウザー利用者サーバーブラウザー利用者秘密(パスワード)を頭の中に持つ【弱点①】推測できる・使い回される【弱点②】偽サイトにも同じように入力できてしまう(見た目で区別不能)【弱点③】秘密が経路を流れるTLSで守られるが終端では平文に戻る【弱点④】全利用者の秘密(のハッシュ)が集積漏洩すればオフライン総当たりの的になるパスワードを入力パスワードそのものを送信保存済みハッシュと照合

図1: パスワード認証では、秘密そのものが全区間に存在する

攻撃者から見ると、これは的が多くて撃ちやすい構造です。

  • 弱点①(利用者): 覚えられる程度の強度しかなく、複数サイトで使い回される。1か所の漏洩が全アカウントに波及する(パスワードリスト型攻撃)。
  • 弱点②(入力の瞬間): 本物と見分けのつかない偽サイトを用意すれば、利用者は自分から秘密を差し出してくれる(フィッシング)。
  • 弱点③(経路): TLSがあるので経路そのものの盗聴は難しいが、「正規の見た目をした中継点」を挟まれると意味がない(後述のAiTM)。
  • 弱点④(サーバー): ハッシュ化して保存していても、データベースが流出すればオフラインで総当たりにかけられる。弱いパスワードから順に割れていく。

「ではワンタイムコード(SMSやTOTP)を足せばいいのでは」というのが従来の多要素認証ですが、これも共有された秘密を送る構造は変わっていません。TOTPはサーバーと認証アプリが同じシード(秘密)を共有していますし、生成された6桁コードは結局利用者が偽サイトに入力できてしまいます。実際、偽サイトが本物のサーバーへリアルタイムに中継するAiTM(Adversary-in-the-Middle)型のフィッシングは、パスワード+ワンタイムコードの組をそのまま横流しして突破します。CISA(米国のサイバーセキュリティ庁)が「フィッシング耐性のあるMFA」として挙げるのが、FIDO/WebAuthn方式と、スマートカード(PIV/CAC)のようなPKIベース認証の2つだけで、中でもFIDOをゴールドスタンダードと位置付けているのは、このためです。4

つまり問題はパスワードの「強度」ではなく、「秘密を共有して、認証のたびに送る」という構造そのものにあります。

3. パスキーの正体 ── 秘密を送らず、持っていることを証明する

パスキーは、W3CのWebAuthnとFIDOアライアンスのCTAPという2つの標準(合わせてFIDO2)の上に成り立つ、公開鍵暗号ベースの資格情報です。21 難しそうに聞こえますが、構造は単純です。

サーバー利用者のデバイスローカルで照合数学的なペア(署名を作る側)公開鍵漏れても悪用できない『検証専用』の情報認証器(金庫)Windows Hello / Face ID /Androidの画面ロック / セキュリティキー秘密鍵ここから一切出ない指紋・顔・PIN= 金庫の扉を開けるだけこれも外に出ない

図2: パスキーの実体はサイトごとの鍵ペア。秘密側はデバイスから出ず、サーバーは検証用の公開鍵しか持たない

  • 秘密鍵は署名を作れる側の鍵で、デバイス内の認証器(Windows Hello、iPhoneのFace ID/Touch ID、Androidの画面ロック、あるいはYubiKeyのようなセキュリティキー)に保管され、外に出ません。
  • 公開鍵は署名を検証することしかできない側の鍵で、これをサーバーに預けます。公開鍵から秘密鍵を逆算することは計算量的に不可能なので、漏れても構わない情報です。
  • 指紋や顔などの生体情報は、金庫の扉をローカルで開けるためだけに使われ、これもデバイスから出ません。サーバーに生体情報が送られることはありません。1

登録: 公開鍵「だけ」を渡す

サイトにパスキーを登録するときの流れです。

認証器ブラウザーサーバー(example.com)認証器ブラウザーサーバー(example.com)サーバーが受け取ったのは「漏れても悪用できない情報」だけ登録要求(乱数チャレンジ + サイト情報)このサイト(example.com)用の鍵を作って指紋・顔・PINで本人確認(ローカル)新しい鍵ペアを生成秘密鍵は内部に保管公開鍵 + credential ID(鍵の名札)公開鍵 + credential ID を送信このアカウントの公開鍵として保存

図3: 登録時にネットワークを流れ、サーバーに保存されるのは公開鍵だけ

重要なのは、このとき鍵ペアがサイトのドメイン(RP ID)に紐付けて作られることです。example.com 用に作られたパスキーは example.com のサイトでしか使えません(RP IDはドメイン単位なので、login.example.com のような同じドメイン配下のサブドメインのページからは使えますが、無関係なドメインからは使えません)。この紐付けが、後述するフィッシング耐性の土台になります。3

また、鍵ペアはサイトごとに毎回新しく作られます。サイトAとサイトBのパスキーは数学的に無関係なので、「使い回し」という概念自体が存在せず、サイト間で利用者を突き合わせる材料にもなりません。

認証: その場限りの署名を返す

ログイン時の流れです。パスワード認証(図1)と見比べてください。

認証器ブラウザーサーバー(example.com)認証器ブラウザーサーバー(example.com)経路を流れるのは使い捨ての署名だけ盗んでも次回のチャレンジには使えないログイン要求(その場限りの乱数チャレンジ)example.com への署名要求指紋・顔・PINで本人確認(ローカル)秘密鍵で署名を作成チャレンジ + オリジン + RP IDハッシュを焼き込む署名(秘密鍵そのものではない)署名を送信保存済みの公開鍵で署名を検証チャレンジ・オリジン・RP IDも確認

図4: 認証時も秘密は移動しない。流れるのは「その場限りの証明書類」だけ

サーバーは毎回新しい乱数(チャレンジ)を出題し、認証器は「そのチャレンジ+いまブラウザーが見ているオリジン+RP IDのハッシュ」に対して署名します。サーバーは保存してある公開鍵で署名を検証し、チャレンジが自分の出題したものであること、オリジンとRP IDが自サイトのものであることを確認します。5

この設計の帰結として、冒頭の3つの理由のうち2つがすでに成立しています。

  • サーバーに秘密がない: 保存されているのは公開鍵だけ。流出しても攻撃者は署名を作れないので、パスワードのハッシュのように「持ち帰って割る」ことができません。
  • 秘密が流れない: 経路上の署名を盗んでも、チャレンジは使い捨てなので再利用(リプレイ)できません。

残る1つ、「偽サイトでは署名が成立しない」が、パスキー最大の売りです。節を分けて見ます。

4. フィッシングが「構造的に」成立しない理由

パスワードに対するフィッシングが成功するのは、本物の秘密を偽サイトに入力できてしまうからです。人間には example.comexamp1e.com の区別が(疲れていれば特に)つきませんが、パスワード入力欄はどちらのサイトでも同じように動きます。

パスキーでは、この照合を人間ではなくブラウザーが機械的に行います。WebAuthnの仕様上、ブラウザーは「いま表示しているオリジンのドメイン」と「パスキーのRP ID」が対応する場合にしか認証器を呼び出せません。3 偽サイトにアクセスした時点で何が起きるかを図にします。

本物のサーバー(example.com)偽サイト(examp1e.com)本物へ中継するAiTMプロキシブラウザー利用者本物のサーバー(example.com)偽サイト(examp1e.com)本物へ中継するAiTMプロキシブラウザー利用者仮に何らかの方法で署名が作られても、署名には examp1e.com が焼き込まれるため本物のサーバーの検証で必ず落ちる見た目そっくりのログイン画面にアクセス(裏で)本物のログイン処理を開始チャレンジチャレンジを横流しして署名を要求いまのオリジンは examp1e.comexample.com 用のパスキーは候補に出せない署名は作られない(利用者は騙されようがない)

図5: AiTM型フィッシングはパスワード+ワンタイムコードを突破するが、パスキーでは署名の段階で成立しない

防御が二重になっていることに注目してください。

  1. 候補に出ない: ブラウザーはオリジンに対応するRP IDのパスキーしか列挙しません。偽ドメイン上では本物サイト用のパスキーが選択肢に現れないので、利用者は「うっかり使う」ことすらできません。
  2. 署名が通らない: 署名対象にはブラウザーが確認したオリジンとRP IDのハッシュが含まれます。本物のサーバーは検証時にこれを照合するため、別オリジンで作られた署名は必ず拒否されます。5

パスワードのフィッシング対策は「利用者がURLをよく見る」という人間の努力に依存していました。パスキーでは利用者が偽サイトを見抜く必要がそもそもない。これが「フィッシング耐性(phishing-resistant)」という言葉の正確な意味であり、CISAやNIST(米国標準技術研究所)がFIDO/WebAuthn方式を特別扱いする理由です。46

ここまでの内容を、攻撃手法ごとに整理します。

攻撃 パスワード パスワード+TOTP パスキー
推測・総当たり ✗ 弱い △ コードは防ぐが元パスワードは弱いまま ○ 推測対象が存在しない
使い回し(リスト型攻撃) ✗ 1か所の漏洩が全体に波及 △ コード未対応サイトから崩れる ○ サイトごとに独立した鍵
サーバーのDB漏洩 ✗ ハッシュをオフラインで総当たり ✗ TOTPのシード(共有秘密)も漏れる ○ 公開鍵しかない
古典的フィッシング(偽サイトで入力させる) ✗ 入力できてしまう ✗ コードも入力できてしまう ○ 候補に出ず、署名も通らない
AiTM(リアルタイム中継) ✗ そのまま横流しされる ✗ コードごと横流しされる ○ オリジン照合で署名が成立しない
リプレイ(通信の再利用) ✗ 同じパスワードが何度でも有効 △ 本人が使う前に横取りされたコードは有効(使用済みコードの再受理は正しい実装なら拒否される) ○ チャレンジが毎回使い捨て

表2: 攻撃手法ごとの耐性比較。パスキーの「○」はどれも運用や注意力ではなく構造に由来する

5. 「同期されるパスキー」は安全なのか

ここまでの説明を読むと、当然こういう疑問が湧きます。「秘密鍵はデバイスから出ないと言ったのに、iPhoneで作ったパスキーがiPadでも使えるのはなぜだ」──良い疑問で、答えは「パスキーには2種類ある」です。

先に結論を早見表にしておきます。この節と次の節は、この表の各行がなぜそうなるのかを説明していると思って読んでください。

観点 同期型パスキー デバイス固定型パスキー
代表例 iCloudキーチェーン、Googleパスワードマネージャー、1Passwordなどのパスワードマネージャー セキュリティキー(YubiKeyなど)、Windows Hello、Microsoft Authenticator内のパスキー
秘密鍵の保管場所 プラットフォームの資格情報保管庫。同じアカウントのデバイス間にエンドツーエンド暗号化された形で複製される 認証器のハードウェア内。TPMやセキュアエレメントの外へは出ない
紛失・機種変更時 同じApple ID/Googleアカウントにサインインすれば新端末に復元できる その認証器のパスキーは失われる。予備の認証器の複数登録が前提
単一障害点 プラットフォームのクラウドアカウント 物理デバイスそのもの
法人管理の向き不向き 鍵が個人のクラウドアカウントに入るため、組織側から所在の把握や一括失効がしにくい。BYODや小規模には向く 管理者が配布・失効でき、鍵の所在が明確。規程の厳しい環境向き
NISTのAAL適合 要件を満たせばAAL2。秘密鍵がエクスポート可能なためAAL3には使えない6 ハードウェアで保護され鍵を取り出せない認証器は、AAL3が求める要件にも対応しうる6

表3: 同期型とデバイス固定型の早見表。どちらを選ぶかは「紛失への強さ」と「鍵の所在を管理できること」のどちらを取るかで決まる

デバイス固定型パスキーセキュリティキー(YubiKeyなど) /Windows Hello /Microsoft Authenticator(Entra ID)秘密鍵はそのハードウェアから物理的に出ない(TPMなどで保護)利点: 鍵の所在が1か所で明確注意: 紛失に備え複数登録が必須同期型パスキー(コンシューマー向けの既定)iCloudキーチェーン /Googleパスワードマネージャー /1Passwordなどのパスワードマネージャー同じアカウントのデバイス間でエンドツーエンド暗号化して同期事業者も中身を読めない利点: 機種変更・紛失に強い注意: クラウドアカウント自体の防御が要

図6: 同期型とデバイス固定型。どちらも「秘密鍵をサーバーに送らない」点は同じで、守り方の重心が違う

同期型パスキーは、iCloudキーチェーンやGoogleパスワードマネージャーが秘密鍵を同じアカウントのデバイス間で同期するものです。ここで重要なのは、同期がエンドツーエンド暗号化されていることです。AppleもGoogleも、パスキーはデバイス上で暗号化されてから同期され、事業者自身も中身を読めないと明言しています。78 つまり「秘密鍵がデバイスから出ない」という原則は、正確には「秘密鍵は平文ではデバイスから出ない」に緩和され、その代わりに機種変更や紛失への耐性を得ています。

この緩和が脅威モデルをどう変えるかは、はっきり言語化しておくべきです。守るべき場所が「各サイトのサーバー」から「クラウドアカウント1つ」に集約されるのです。各サイトのDB漏洩やフィッシングには相変わらず強いまま、今度はApple ID/Googleアカウント自体の乗っ取りが単一障害点になります。だからこそ、パスキーを預けるプラットフォームアカウントには最強の保護(強力な画面ロック、回復手段の整理、可能なら物理セキュリティキー)をかけるのが大前提です。NISTも2024年4月にNIST SP 800-63B の補遺(Supplement 1: Incorporating Syncable Authenticators Into NIST SP 800-63B)を出し、この同期型パスキー(syncable authenticator)が要件を満たせば政府基準のAAL2(Authenticator Assurance Level 2、認証器保証レベル2)を満たしうると正式に位置付けました。ただし、秘密鍵がエクスポートされうる以上、ハードウェアで隔離された環境を要求するAAL3には同期型を用いないこととされています。6

デバイス固定型パスキーは、秘密鍵がハードウェアから出ないタイプです。YubiKeyのようなセキュリティキーが典型で、法人向けではMicrosoft Entra IDのパスキー(Microsoft Authenticator内に作るもの)もデバイス固定型です。9 WindowsのWindows Helloも、TPMがあれば秘密鍵をTPM配下で保護します。この「鍵を外に出さないハードウェア金庫」の仕組み自体は、TPMの記事で詳しく解説したものと同じ土台です。

なお、「スマホのパスキーでPCのブラウザーにログインする」ときにQRコードを読み取らされるのを不思議に思ったことがあるかもしれません。あれは単なる画面遷移ではなく、BluetoothでスマホとPCの物理的な近接を確認するハイブリッド方式(FIDOのcross-device認証)です。遠隔の攻撃者が自分のPCへのログインをQRコード経由で他人に承認させる、という攻撃を近接確認で潰しています。1

6. 銀の弾丸ではない ── 弱点は「消える」のではなく「移動する」

ここまでパスキーの強さを説明してきましたが、誠実に言えば、パスキーは攻撃を消滅させるのではなく攻撃者をより弱い場所へ追いやる技術です。認証の玄関が固くなったとき、攻撃者がどこへ回るかを図にします。

攻撃者認証そのものチャレンジ署名【固い】アカウント回復フロー『パスキーを失くした』と申告してSMSやメールで再設定させ、攻撃者のパスキーを登録する併存するフォールバックパスワード・SMSログインが残っていれば最弱リンクはそこクラウドアカウント同期型ならApple ID /Googleアカウントが単一障害点セッションログイン後のCookieを盗めば認証方式は関係ない

図7: 玄関(認証)が固くなると、攻撃は回復フロー・併存手段・クラウドアカウント・セッションへ移る

実務で押さえておくべき残存リスクは4つです。

  1. 併存するフォールバックが最弱リンクになる。パスキー「も」使えるようにしただけで、パスワードやSMSログインが残っていれば、攻撃者はそちらを使うだけです。フィッシング耐性はアカウント全体で見ればいちばん弱いログイン手段のレベルに律速されます。導入の本丸は、パスキー追加ではなくフォールバックの計画的な縮小・廃止です。
  2. 回復フローが新たな攻撃面になる。「デバイスを失くした」と偽ってサポート窓口やメール経由の再設定に持ち込み、攻撃者自身のパスキーを登録させる手口です。実際に、強固な認証を回避してヘルプデスクを騙すソーシャルエンジニアリングは大規模侵害の常套手段になっています。認証を固めたぶん、回復フローの本人確認をどう設計するかが問われます。
  3. 同期型ではクラウドアカウントが単一障害点。前節のとおりです。パスキーを預けるアカウントの防御と、組織で使う場合の「どのプラットフォームへの同期を許すか」の方針決めが必要です。
  4. セッション窃取は防げない。パスキーが守るのはログインの瞬間だけで、ログイン後のセッションクッキーをマルウェアやXSSで盗まれれば認証方式は関係ありません。トークンの有効期間・バインディング・デバイス健全性の管理という別レイヤーの仕事は残ります。

これらは「パスキーはやめておこう」という話ではありません。玄関の鍵を最新にしても窓の施錠は別の仕事だ、という当たり前の話です。むしろ弱点の場所が明確になるぶん、防御リソースを回復フローとセッション管理に集中投下できるようになります。

7. 実務での導入 ── WebAuthn APIとWindows環境

最後に、導入する側の視点で要点を押さえます。

自社Webサービスにパスキーログインをつける

ブラウザー側はWebAuthn APIの2つの関数だけです。登録は navigator.credentials.create()、認証は navigator.credentials.get() を呼びます。

// 登録(ブラウザー側)
const credential = await navigator.credentials.create({
  publicKey: {
    challenge: challengeFromServer,   // サーバーが生成した使い捨ての乱数
    rp: { id: "example.com", name: "Example" },
    user: { id: userIdBytes, name: "taro@example.com", displayName: "太郎" },
    pubKeyCredParams: [{ type: "public-key", alg: -7 }],  // ES256
    authenticatorSelection: {
      residentKey: "required",        // ディスカバラブル資格情報(=パスキー)にする
      userVerification: "required",   // 生体認証/PINによる本人確認を必須にする
    },
  },
});
// 公開鍵は credential.response から、credential ID はトップレベルの
// credential.id / credential.rawId から取り出す。登録レスポンスも認証時と
// 同様にチャレンジ・オリジン・RP IDをサーバーで検証してから保存する

主要なパラメーターの意味は次のとおりです。

パラメーター 役割 実装時の注意
challenge サーバーが毎回生成する使い捨ての乱数 推測できない暗号論的乱数を使う。サーバー側で「自分が発行した未使用のもの」であることを検証して消費する
rp.id 資格情報を紐付けるドメイン(RP ID) 省略すると呼び出し元オリジンの実効ドメインになる。login.example.com から example.com を指定するような、登録可能ドメインの範囲でしか指定できない
user.id サーバー内部のユーザー識別子(user handle) 64バイト以下の不透明な値。メールアドレスやユーザー名など、個人を特定できる情報をそのまま入れない2
user.name / user.displayName 認証器やブラウザーのUIに表示され、利用者がアカウントを選ぶための文字列 表示専用。サーバーがこの値を信用してアカウントを特定してはいけない
pubKeyCredParams 受け入れる公開鍵アルゴリズムを優先順に列挙 -7(ES256)に加えて -257(RS256)も併記しておくと、受け入れられる認証器の幅が広がる
authenticatorSelection 認証器に求める性質 residentKey: "required" でパスキー(ディスカバラブル資格情報)になり、userVerification: "required" で生体認証・PINによる本人確認が必須になる

表4: navigator.credentials.create() の主要パラメーター

検証環境の注意: WebAuthn APIはセキュアコンテキストでしか公開されないため、素の http:// で配信したページでは navigator.credentials の呼び出しが失敗します。例外は http://localhost(および 127.0.0.1)で、これらは信頼できるオリジンとして扱われるので、開発機ではHTTPS化しなくてもそのまま試せます。ただしRP IDはオリジンの実効ドメイン(またはその親ドメイン)でなければならないので、localhost で作ったパスキーは本番ドメインでは使えません。手元に認証器がなくても、Chromeの開発者ツールの「WebAuthn」タブで仮想認証器を有効にすれば、登録から認証まで一通り動かせます。

// 認証(ブラウザー側)
const assertion = await navigator.credentials.get({
  publicKey: {
    challenge: challengeFromServer,
    rpId: "example.com",
    userVerification: "required",
  },
  // ログイン欄の自動入力候補としてパスキーを提示する。事前に
  // PublicKeyCredential.isConditionalMediationAvailable() で対応を確認し、
  // 非対応ブラウザーでは mediation を付けない通常の呼び出しにフォールバックする
  mediation: "conditional",
  // (対象の<input>に autocomplete="username webauthn" の指定が必要)
});
// assertion.response の署名をサーバーで検証する

本体はサーバー側の検証です。最低限、次を必ず行います。5

  • チャレンジの照合: 自分が発行した未使用のチャレンジか。使い捨てにしているか(リプレイ対策)。さらに、発行時のブラウザーセッション(ログイン試行)に紐付けて保存し、同じセッションからの応答にだけ消費を許すこと。ここが緩いと、攻撃者が自分宛てのチャレンジへの署名を被害者のブラウザー経由で送り込み、被害者を攻撃者のアカウントにログインさせる(ログインCSRF)余地が生まれる。
  • オリジンの照合: clientDataJSONorigin が自サイトの正規オリジンか(フィッシング対策の要)。
  • RP IDハッシュの照合: authenticatorDatarpIdHash が自サイトのRP IDのSHA-256と一致するか。
  • セレモニー種別とフラグの確認: clientDataJSONtype が認証なら webauthn.get、登録なら webauthn.create であるか。authenticatorData のUP(ユーザー在席)フラグが立っているか。ユーザー検証(UV)を要求したなら、UVフラグも立っているか。
  • 署名の検証: 登録時に保存した公開鍵で署名が正しく検証できるか。
  • アカウントとの紐付け: 提示された credential ID(と userHandle)を自分のデータベースで引き、その資格情報の持ち主に対してセッションを発行しているか。別途入力されたユーザー名を無条件に信用すると、正しい署名で他人としてログインさせる穴になる。
  • 署名カウンターの保存と比較: authenticatorData の signCount を資格情報ごとに保存し、次回の値が前回より増えていることを確認する。前回の値以下(同値を含む)なら認証器の複製(クローン)の兆候として扱う。ただし同期型パスキーは常に0を返す実装が多いので、0同士だけは例外として許容する。

この検証を手書きするのは事故のもとなので、実績のあるライブラリ(.NETなら fido2-net-lib、Node.jsなら SimpleWebAuthn など)を使ってください。仕様の細部(CBORのパース、アルゴリズムの合意、チャレンジ管理)はライブラリに任せ、自分たちはチャレンジの保存と失効、複数パスキーの管理UI、回復フローの設計に集中するのが正しい力の配分です。

Windows環境・社内システムの場合

このサイトの読者層である「Windowsの業務システムを預かる立場」からは、次の3点を押さえておけば十分です。

  • Windowsクライアントは対応済み。Windows 11はWindows Helloを認証器としてパスキーの作成・利用・管理(設定 > アカウント > パスキー)に対応しており、秘密鍵はTPMがあればハードウェア保護されます。10 ブラウザー(Edge/Chrome)経由のWebAuthnはWindows 10でも動きます。
  • Entra ID環境では「パスキー=FIDO2認証方式」を有効化する。Microsoft Entra IDはセキュリティキーとMicrosoft Authenticatorアプリ内のパスキー(デバイス固定型)をサポートしており、条件付きアクセスの認証強度で「フィッシング耐性MFA」を要求すれば、対象リソースへのアクセスをパスキー等に限定できます。9 NTLMやパスワード期限ポリシーの世界からの移行は一足飛びには進まないので、NTLMとKerberosの記事で扱った認証基盤の棚卸しと並行して、まず管理者アカウントからフィッシング耐性MFAを義務化するのが定石です。
  • 社内Webアプリでも恩恵は同じ。ただしHTTPSが前提。WebAuthn APIはセキュアコンテキストでしか動かないため、イントラネットのアプリでも(開発時のlocalhostを除き)HTTPS化と、RP IDとして使える内部ドメイン名の整備が先決です。それさえ済めばRP IDは内部ドメインに対しても機能します。パスワード付箋との決別という意味では、外向けサービスより社内のほうが効果が早く出ることも珍しくありません。

8. まとめ

  • パスワードの弱点は強度ではなく、「秘密を共有し、認証のたびに送る」という構造にある。秘密が利用者・入力欄・経路・サーバーのすべてに存在するため、攻撃対象が多い。ワンタイムコードを足しても、AiTM型フィッシングには中継されて敗北する。
  • パスキーはサイトごとの公開鍵暗号の鍵ペアであり、サーバーには漏れても悪用できない公開鍵だけを渡し、ログイン時は使い捨てチャレンジへの署名だけを送る。サーバーに秘密がなく、経路にも秘密が流れない
  • 署名にはブラウザーが確認したオリジンとRP IDが焼き込まれるため、偽サイトでは本物用のパスキーが候補に出ず、中継しても検証で落ちる。利用者が偽サイトを見抜く必要がないことが「フィッシング耐性」の正体で、防御の根拠が人間の注意力からプロトコルの構造に移った。
  • 同期型パスキーはエンドツーエンド暗号化で同期され、機種変更・紛失に強い。その代わり守るべき場所がクラウドアカウントに集約されるので、Apple ID/Googleアカウント自体の防御が大前提になる。法人はデバイス固定型(セキュリティキー、Entra IDのAuthenticatorパスキー)も選べる。
  • パスキーは攻撃を消すのではなく弱い場所へ追いやる。併存するパスワード、アカウント回復フロー、セッション窃取が残る攻撃面であり、導入の本丸はフォールバックの計画的縮小と回復フローの強化にある。
  • 実装はWebAuthn APIの create / get の2関数+サーバー検証。検証は自作せず実績あるライブラリに任せ、チャレンジ管理・複数パスキーのUI・回復設計に力を割く。

関連記事

関連する相談領域

合同会社小村ソフトでは、社内WebシステムへのパスキーログインWebAuthn実装の支援、Entra ID環境でのフィッシング耐性MFA展開の設計、WinForms/WPFなどWindows業務アプリへの認証組み込みを含む受託開発を扱っています。

  1. FIDOアライアンス, Passkeys(パスキー)およびHow FIDO Works。パスキーがFIDO資格情報としてパスワードを置き換えるものであること、生体情報がデバイスから送信されずローカルでの照合にのみ使われること、2022年5月にApple・Google・マイクロソフトがFIDO標準によるパスワードレスへの対応拡大を共同で表明したこと、デバイスをまたぐ利用(cross-device)ではQRコードとBluetoothによる近接確認を用いるハイブリッド方式が使われることについて。  2 3 4 5

  2. W3C, Web Authentication: An API for accessing Public Key Credentials Level 2(W3C勧告)。WebAuthnが公開鍵暗号ベースの資格情報を作成・利用するためのAPIであること、資格情報の秘密鍵は認証器に保持されサーバー(Relying Party)には公開鍵とcredential IDのみが登録されること、認証はサーバーが送るチャレンジへの署名(アサーション)によって行われること、資格情報のスコープと保護の設計目標について。あわせて、APIがセキュアコンテキストでのみ公開されること、RP IDが省略時に呼び出し元オリジンの実効ドメインになること、user handle(user.id)が最大64バイトの不透明な値であり、ユーザー名やメールアドレスのような個人を特定する情報を含めるべきでないこと(§14.6.1 User Handle Contents)についても本文で参照している。  2 3 4 5

  3. W3C, Web Authentication Level 2 — §5.1.3 Create / RP ID validation, §13.4.9 Regarding phishing。公開鍵資格情報がRP ID(Relying Party識別子=ドメイン)にスコープされること、ブラウザー(クライアント)が呼び出し元オリジンの登録可能ドメインとRP IDの対応を検証し、対応しない場合は資格情報の作成・利用を拒否すること、これによって偽オリジンからは他サイト用の資格情報へアクセスできず、WebAuthnが中間者型を含むフィッシング攻撃への耐性を持つことについて。  2 3

  4. CISA, Implementing Phishing-Resistant MFA(2022年10月のファクトシート)。SMSや音声、プッシュ通知、OTPを用いるMFAがフィッシングやAiTM(中継)攻撃・MFA疲労攻撃に対して脆弱であること、フィッシング耐性のある方式としてFIDO/WebAuthn認証とPKIベース認証(スマートカード等)が挙げられ、FIDO/WebAuthn認証がゴールドスタンダードと位置付けられていること、組織はまず高リスクアカウントからフィッシング耐性MFAへ移行すべきことについて。  2

  5. W3C, Web Authentication Level 2 — §7.2 Verifying an Authentication Assertion。サーバー側の検証手順として、clientDataJSONのtype・challenge(自ら発行したものとの一致)・originの検証、authenticatorData内のrpIdHashが期待するRP IDのSHA-256ハッシュと一致することの検証、User Present / User Verifiedフラグの確認、保存済み公開鍵による署名検証が規定されていることについて。  2 3

  6. NIST, Incorporating Syncable Authenticators Into NIST SP 800-63B(2024年4月の補遺、SP 800-63B第4版に統合)。同期可能な認証器(同期型パスキー)の秘密鍵が要件を満たす形で同期ファブリックに保管・複製される場合にAAL2を満たしうること、一方でAAL3の暗号認証器にはハードウェアで保護・隔離された環境が求められるため、秘密鍵がエクスポート可能な同期型認証器はAAL3では使用しないこととされていること、WebAuthnのようにオリジン検証を行う方式が検証者なりすまし耐性(フィッシング耐性)を持つと整理されていることについて。原文PDFはNIST SP 800-63B Supplement 1。  2 3 4

  7. Appleサポート, パスキーのセキュリティについて。パスキーがiCloudキーチェーンで同期されること、iCloudキーチェーンがエンドツーエンド暗号化されておりAppleも読み取れないこと、同期はユーザーのデバイス上の鍵によって保護され、レート制限付きのエスクロー経由の復旧が用意されていることについて。 

  8. Google, Googleパスワードマネージャーにおけるパスキーのセキュリティ。パスキーの秘密鍵がデバイス上で暗号化されたうえで同期されること、エンドツーエンド暗号化によりGoogle自身も秘密鍵の中身にアクセスできないこと、復元には端末の画面ロック等に基づく保護が要求されることについて。 

  9. Microsoft Learn, Microsoft Entra IDでのFIDO2認証(パスキー)の有効化。Entra IDがFIDO2セキュリティキーおよびMicrosoft Authenticatorのパスキー(デバイスバインド)によるフィッシング耐性のあるパスワードレス認証をサポートすること、認証方法ポリシーでの有効化と条件付きアクセスの認証強度(フィッシング耐性MFA)による要求が可能なことについて。  2

  10. Microsoft Learn, Windowsでのパスキーのサポート。Windows 11がWindows Helloを用いたパスキーの作成・利用に対応すること、保存済みパスキーを設定 > アカウント > パスキーから管理できること、Windows Helloの資格情報がTPMの利用可能な環境ではハードウェアで保護されること、モバイルデバイス上のパスキーをQRコード経由で利用できることについて。 

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

パスキーとパスワードの根本的な違いは何ですか?
パスワードは「利用者とサーバーが同じ秘密を共有し、ログインのたびにその秘密を送る」仕組みです。秘密が利用者の頭の中・入力欄・通信経路・サーバーのデータベースと、あらゆる場所に存在するため、そのすべてが攻撃対象になります。パスキーは公開鍵暗号の鍵ペアを使い、秘密鍵がサーバーに送られることはありません。デバイス固定型では秘密鍵は認証器から一切出ず、同期型でもエンドツーエンド暗号化された形でしか外に出ません。サーバーに保存されるのは公開鍵という「漏れても悪用できない情報」だけで、ログイン時に送られるのも、その場限りのチャレンジに対する署名だけです。つまりパスワードの弱点だった「共有された秘密」そのものが存在しません。加えて鍵ペアはサイトごとに別々に作られるため、使い回しという概念も成立しません。
生体情報(指紋・顔)はサーバーに送られるのですか?
送られません。指紋や顔のデータは、デバイスの中で「秘密鍵の入った金庫の扉を開ける」ためだけに使われるローカルな照合であり、FIDOの設計上、生体情報がデバイスの外へ送信されることはありません。サーバーが受け取るのは「利用者の本人確認(ユーザー検証)が行われた」というフラグの立った署名だけで、指紋そのものはもちろん、その特徴量も一切含まれません。生体認証が使えない場面ではPINで代替できますが、このPINもWindows HelloのPINと同様にデバイスのローカルでのみ照合されるもので、ネットワークを流れない点はパスワードと決定的に異なります。
なぜパスキーはフィッシングに強いのですか?
利用者が偽サイトを見抜く必要が、仕組みの上でそもそもないからです。パスキーはサイトのドメイン(RP ID)に紐付けて作られ、ブラウザーは「いま表示しているサイトのドメイン」に対応するパスキーしか候補に出しません。本物そっくりの偽ドメインにアクセスしても、本物のサイト用のパスキーは選択肢に現れず、利用者は騙されようがありません。さらに署名にはブラウザーが確認したオリジンとRP IDのハッシュが焼き込まれるため、仮に署名を中継しても本物のサーバー側の検証で落ちます。パスワードやSMSコードのように「本物の資格情報を偽サイトに入力してしまう」という事故が構造的に起こせないのが、訓練や注意喚起に頼る対策との根本的な違いです。
スマホを失くしたらアカウントに入れなくなりますか?
同期型のパスキー(iCloudキーチェーンやGoogleパスワードマネージャーに保存されるもの)であれば、同じApple ID/Googleアカウントにサインインした新しいデバイスに復元できます。ただし、エンドツーエンド暗号化された保管庫の復元にはアカウントのパスワードだけでなく、以前の端末の画面ロック(パスコード)の入力などの追加の本人確認が求められるため、これらの回復手段も失うと復元できないことがあります。スマホ1台だけに全てを預けない構えが重要です。デバイス固定型(セキュリティキーやWindows Helloなど)は端末と運命を共にするので、重要なアカウントには複数のパスキーを登録しておくのが定石です。多くのサービスは1アカウントに複数のパスキーを登録できます。紛失時の無効化は種類で手順が変わる点に注意してください。同期型は各デバイスのコピーが同じ1つの資格情報なので、まずプラットフォームのアカウント側で紛失端末の削除やリモートワイプを行って端末上のコピーを使えなくします(サービス側のアカウント設定でそのパスキーを削除すると、全デバイスのコピーが一括で無効になります)。デバイス固定型なら、サービス側でその認証器のパスキーを削除すれば失くした鍵だけを無効化できます。組織で使う場合は「利用者が自力で復旧できる二重化」と「紛失時に管理者が失効させる手順」をセットで設計しておくことが重要です。
パスキーにも弱点はありますか?
あります。ただし弱点の場所が変わる、という言い方が正確です。認証そのものは公開鍵暗号で固くなるため、攻撃者はより弱い周辺部を狙います。具体的には、パスワードやSMSなど従来の手段が併存していればそこが最弱リンクとして残ること、アカウント回復フローを悪用して攻撃者が自分のパスキーを登録する手口、同期型ではクラウドアカウント自体の乗っ取りが新たな単一障害点になることです。またログイン後のセッションクッキーを盗む攻撃はパスキーでは防げないので、無関係な脅威が消えるわけでもありません。導入時は「パスキーを足す」だけでなく、回復フローの強化とフォールバック手段の計画的な縮小まで含めて設計する必要があります。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る