Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025
Slide 2
Slide 2 text
ぜひいっぱいツイートしてください! #phperkaigi #b
Slide 3
Slide 3 text
自己紹介 ヒビキ @hibiki_cube
Slide 4
Slide 4 text
PHPerKaigi、ただいま〜〜〜〜!!
Slide 5
Slide 5 text
パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025
Slide 6
Slide 6 text
パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025
Slide 7
Slide 7 text
何らかのログインを 実装したことがある という方!
Slide 8
Slide 8 text
パスキーでのログインを 実装したことがある という方!
Slide 9
Slide 9 text
実は今回………
Slide 10
Slide 10 text
実は今回……… この発表のために デモ環境を ご用意しています!
Slide 11
Slide 11 text
とりあえず触ってみましょう phperkaigi-2025-try-passkey.hibiki-cube.dev
Slide 12
Slide 12 text
とりあえず触ってみましょう
Slide 13
Slide 13 text
いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる
Slide 14
Slide 14 text
いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる → ユーザーは何も覚える必要がない
Slide 15
Slide 15 text
いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる → ユーザーは何も覚える必要がない → 人間起因のセキュリティリスクを極力減らせる
Slide 16
Slide 16 text
パスキーの特徴 ● 生体認証とセットで動作 ● ログイン時に入力するものは何もなし ● サイトとパスキーが紐づく仕組み ● 公開鍵暗号の仕組みを使った認証 ● 機密性のある情報は暗号化されて守られる Passkeys
Slide 17
Slide 17 text
パスキーの特徴 ● 生体認証とセットで動作 ● ログイン時に入力するものは何もなし ● サイトとパスキーが紐づく仕組み ● 公開鍵暗号の仕組みを使った認証 ● 機密性のある情報は暗号化されて守られる Passkeys
Slide 18
Slide 18 text
公開鍵暗号で認証する仕組み
Slide 19
Slide 19 text
公開鍵暗号で認証する仕組み
Slide 20
Slide 20 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵
Slide 21
Slide 21 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 俺の鍵持っといて
Slide 22
Slide 22 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 (なにこの鍵)
Slide 23
Slide 23 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 ログインしたいな
Slide 24
Slide 24 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 ログインしたいな じゃあこの問題を 解いてみな
Slide 25
Slide 25 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 秘密鍵で 署名したよ
Slide 26
Slide 26 text
公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 秘密鍵で 署名したよ 確かに正しい鍵だ 通ってよし!
Slide 27
Slide 27 text
余談: パスキーはSSHに似てる? SSH パスキー ユーザーがキーを生成・転送 登録の仕組み システムがキーを生成・転送 なし ログイン時にすること 認証操作 公開鍵と秘密鍵の一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり
Slide 28
Slide 28 text
従来のパスワード認証とパスキーを比較
Slide 29
Slide 29 text
従来のパスワード認証とパスキーを比較 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり
Slide 30
Slide 30 text
パスキー認証に必要なユーザー操作 プロンプトを確認して 生体認証するだけ
Slide 31
Slide 31 text
従来のパスワード認証とパスキーを比較 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり
Slide 32
Slide 32 text
フィッシングを防ぐ仕組み ● 各パスキーはRP IDでサービスに紐づいている ● パスキーと対応するオリジンでないと使えない ● どんなに見た目を似せたサイトでも、パスキーを使うことは不可能 HIBIKI @ Google google.com 🔒goo9le.com
Slide 33
Slide 33 text
従来のパスワード認証とパスキーを比較 パスキーなら、よりセキュアな認証を実現できる🚀 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり
Slide 34
Slide 34 text
パスキーは運営側も嬉しい パスワード パスキー IDとパスワードを保存 登録時にすること ユーザー名と公開鍵の保存 IDとパスワードの検証 ログイン時にすること チャレンジの検証 パスワードのハッシュ 保持するもの 公開鍵 パスワードのハッシュ 通信経路を流れるもの 署名されたチャレンジ ハッシュを破られると…? 情報漏洩のリスク 公開鍵は漏れても大丈夫 ⚠ 可能 認証情報の使い回し ✅ 不可能
Slide 35
Slide 35 text
実際に実装するには
Slide 36
Slide 36 text
有名どころはパスキー対応済み!
Slide 37
Slide 37 text
もちろんPHP用のサーバーサイドライブラリもあります!
Slide 38
Slide 38 text
必要なもの フロントエンド ● 登録やログインのためのUI ● APIとやり取りする仕組み ● デバイスの認証機とやり取りする仕組み バックエンド ● ユーザーとパスキーを管理するDB ● チャレンジを発行するAPI ● 署名されたチャレンジを検証するAPI ● セッションを管理する仕組み
Slide 39
Slide 39 text
ユーザーとパスキーを管理するDB
Slide 40
Slide 40 text
実装上・運用上の注意
Slide 41
Slide 41 text
パスキーを実装する上で気にすること ● フォームの設計 ● 既存のユーザーID / パスワード認証との共存 ● autocompleteを適切に設定すると嬉しい
Slide 42
Slide 42 text
パスキーを運用する上で気にすること ● パスキーにまだ慣れていないユーザーへの対応 ● パスキーを紛失したときの対応 ○ パスワードで再設定できるようにする? ○ 復旧コードなどを事前に発行しておく? ○ マジックリンクで復旧できるようにする? ● 他の選択肢が多ければ、それだけセキュリティの弱みも増える
Slide 43
Slide 43 text
Passkeyと仲良く!