Chrome Tech Talk Night #16
パスキー
NRIセキュアテクノロジーズ 古川英明
メルカリkokukuma, koi
© FIDO Alliance 2024
1
© FIDO Alliance 2024
1
スピーカーの紹介
© FIDO Alliance 2024
2
© FIDO Alliance 2024
2
セッションスピーカー
NRIセキュアテクノロジーズ �古川英明
メルカリ kokukuma
メルカリ�koi
© FIDO Alliance 2024
3
Agenda
© FIDO Alliance 2024
4
概要説明
メルカリ koi
© FIDO Alliance 2024
5
© FIDO Alliance 2024
5
メルカリの事例を紹介
6
メルカリのFIDO導入までの軌跡
2023/3�(App)
2023/4
(App)
2023/10 (Web)
2024/2�(App)
パスキーの登録
メルカリ登録メールアドレス
Googleアカウント
Step 1
登録ボタンを押下
Step 2
SMS認証
Step 3
パスキー作成
完了 👏
パスキーを使ったログイン
Step 1
ログイン画面を表示
Step 2
パスキーを選択
Step 3
顔や指紋、画面ロックで認証
完了 👏
クロスデバイス認証
Step 1
ログイン画面を表示
Step 2
QRコード表示
Step 3
カメラでQRコード読み取り
顔や指紋、画面ロックで認証
完了 👏
パスキー登録済みデバイス
FIDO認証における実績と効果
所要時間
認証成功率
400万
4.4秒
82.5%
登録者数
登録者数は2024/5の実績
その他数値は2023年のメルカリのデータから算出
認証の利用実態
SMS OTPとFIDOの認証実績比較
メルコインにおけるフィッシングによる被害
※ 2024/5時点で現時点でのメルコインサービスでの不正購入の入信、調査実績による
0件
どのような訴求をしているの?
ログイン後パスキー登録訴求
パスキー未登録のお客様へ、次回以降のログインがスムーズになることを伝え登録をお願いする画面を表示しています
課題
01
02
03
さらなるフィッシング対策強化
利用者数の拡大
サービス利用中の認証体験の最適化
Appendix
© FIDO Alliance 2024
16
おまけ
© FIDO Alliance 2024
17
動かして学びたい人向け
© FIDO Alliance 2024
18
読んで学びたい人向け
© FIDO Alliance 2024
19
じっくり読んで学びたい人向け
© FIDO Alliance 2024
20
パスキーの登録
メルカリ kokukuma
© FIDO Alliance 2024
21
© FIDO Alliance 2024
21
もくじ
© FIDO Alliance 2024
22
パスキーの登録
© FIDO Alliance 2024
23
ユーザ体験 - パスキーの登録
同じデバイス上に登録
別のデバイス上に登録
別のデバイスで、�QRコードを読んで登録
© FIDO Alliance 2024
24
登録の流れ
© FIDO Alliance 2024
25
登録の流れ - 前半
© FIDO Alliance 2024
26
① ~ ② サーバで情報準備して認証器にリクエスト
① サーバから必要な情報を取得
② クライアントから、認証器にリクエスト
© FIDO Alliance 2024
27
Server側の実装雰囲気
© FIDO Alliance 2024
28
Client側の実装雰囲気
© FIDO Alliance 2024
29
もっと細かいパラメータの解説
PublicKeyCredentialCreationOptions
© FIDO Alliance 2024
30
AuthenticatorAttachment / Hints
使える認証器の種類を指定する�� authenticatorSelection.AuthenticatorAttachment
RPは、navigator.credentials.create() を呼び出してパスキーを作成するときに、�これを使用して、登録を許可する認証機のタイプを指定する事ができます。�e.g., “platform”, “cross-platform”�https://w3c.github.io/webauthn/#enum-attachment
�Hints (near future)
RPは、この列挙を使用して、リクエストを最も適切に完了する方法に関する�ヒントをユーザー エージェントに伝えることができます。�e.g., "security-key", "client-device", "hybrid",�https://w3c.github.io/webauthn/#enum-hints
© FIDO Alliance 2024
31
AuthenticatorAttachment / Hints
どういう指定をするかは、RPのパスキー導入目的による
導入目的 | スタンス | Authenticator Attachment | Hint |
Enterprise | security keyのみ使わせたい | cross-platfrom | security key |
Consumer UX改善 / SMS OTPコスト削減 | OSのダイアログをシンプルにしたい。 security keyとか、hybridとかは使わせなくても良い。 | platform | client-device |
Consumer Phishing対策 | security keyは持ってないので、ださないようにしたい。 | 方法なし | client-device, hybrid |
© FIDO Alliance 2024
32
challenge / rp.id
phishing耐性のある認証を成り立たせる為の必須パラメータ�rp.idとそのsubdomainの範囲が、同じパスキーを利用できる範囲になる�
challenge�パスキー登録をスタートさせたセッションと紐づく、サーバで作成された�ランダムな値を指定。パスキー登録時に検証される。�https://w3c.github.io/webauthn/#sctn-cryptographic-challenges��rp.id�ユーザの登録や認証を行う有効なドメイン名を指定する。�登録されたパスキーは、登録されたrp.idに紐づくRPでの認証でのみ利用できる。https://w3c.github.io/webauthn/#dictionary-rp-credential-params
© FIDO Alliance 2024
33
rp.id / challenge
特にrp.id、せっかく登録したパスキーを、使えない状況に陥る可能性ある
WWDC 24: WebKit for Safari 18 beta adds support for using passkeys across related origins. This lets websites use the same passkey across a limited number of domains which share a credential backend.�
native appの場合も、RP IDと同じドメインで、`.well-known/apple-app-site-association` とか、�`.well-known/assetlinks.json` とか公開する必要ある。�https://developer.apple.com/documentation/xcode/supporting-associated-domains�https://developer.android.com/identity/sign-in/credential-manager#create-passkey
© FIDO Alliance 2024
34
user.id / excludeCredentials
Provider毎にパスキーを一つだけ作るために使われる�
user.id�RP内でユーザを一意に識別する値です。ユーザがログインに使う識別子とは異なり、�ユーザの個人情報を含まないものにします。�https://w3c.github.io/webauthn/#dictionary-user-credential-params�
excludeCredentials�同じデバイスによる多重登録を防ぐために、登録済みのパスキーの識別子をすべて渡します。�個々に指定されたパスキーが既に存在する場合、認証器はエラーを返します�https://w3c.github.io/webauthn/#dictionary-makecredentialoptions�
© FIDO Alliance 2024
35
user.id / excludeCredentials
指定しなきゃいけないものはシンプル。�
© FIDO Alliance 2024
36
user.displayname / user.name
認証時のアカウント選択時に表示したいものを指定する
�user.name�ユーザー アカウントのわかりやすい識別子です。表示のみを目的としています。つまり、�類似の表示名を持つユーザー アカウントの違いをユーザーが判断できるようにします。�たとえば、「alexm」、「alex.p.mueller@example.com」、または「+14255551234」などです。�https://w3c.github.io/webauthn/#dictionary-pkcredentialentity��user.displayName�ユーザー アカウントのわかりやすい名前で、表示のみを目的としています。�RPは、ユーザーがこの名前を選択できるようにする必要がありますが、�必要以上に選択を制限しないでください。�https://w3c.github.io/webauthn/#dictionary-user-credential-params�
© FIDO Alliance 2024
37
user.displayname / user.name
指定しなきゃいけないものはシンプル。が...�
WWDC 24: Safari 18 beta adds support for using mediation=conditional for web authentication credential creation. This allows websites to automatically upgrade existing password-based accounts to use passkeys. Learn more by watching Streamline sign-in with passkey upgrades and credential managers at WWDC24�
© FIDO Alliance 2024
38
residentKey / userVerification / attestation
その他、色々....�� authenticatorSelection.residentKey� Discoverable Credentialsにするかどうかを指定します。� https://w3c.github.io/webauthn/#dictionary-authenticatorSelection�
authenticatorSelection.userVerification�ローカル認証(生体認証、PIN入力など)の必要性を指定します。�https://w3c.github.io/webauthn/#dictionary-authenticatorSelection�
attestation�パスキー生成時の証明伝達に関する設定を指定できます。�https://w3c.github.io/webauthn/#enum-attestation-convey�
© FIDO Alliance 2024
39
residentKey / userVerification / attestation
passkey provider依存な部分が多い。
© FIDO Alliance 2024
40
登録の流れ - 後半
© FIDO Alliance 2024
41
④ ~ ⑥ 認証器から得た情報をサーバで検証・登録
④・⑤ 認証器から得た情報をサーバに渡す
⑥ サーバで情報を検証してパスキー登録
© FIDO Alliance 2024
42
Client側の実装雰囲気
© FIDO Alliance 2024
43
Server側の実装雰囲気
© FIDO Alliance 2024
44
WebAuthnAPI
AuthenticatorAttestationResponseJSON
© FIDO Alliance 2024
45
CollectedClientData
CollectedClientData��認証リクエストに関する情報
https://w3c.github.io/webauthn/#dictdef-collectedclientdata�
検証
https://w3c.github.io/webauthn/#sctn-registering-a-new-credential
© FIDO Alliance 2024
46
attestationObject
authenticator data
�利用された認証器に関する情報
© FIDO Alliance 2024
47
attestationObject
Flags
�認証器の状態や認証の種類を示すフラグ。
https://w3c.github.io/webauthn/#sctn-authenticator-data
検証
https://w3c.github.io/webauthn/#sctn-registering-a-new-credential
© FIDO Alliance 2024
48
attestationObject
attestation statement
�公開キー資格情報自体とそれを作成した認証者に関するステートメントを含む、�特定の種類の署名済みデータ オブジェクトです。�証明機関のキーを使用して作成された証明署名が含まれます。��https://w3c.github.io/webauthn/#sctn-authenticator-data��検証
https://w3c.github.io/webauthn/#sctn-registering-a-new-credential
© FIDO Alliance 2024
49
attestationObject
© FIDO Alliance 2024
50
AttestationResponseの検証方法まとめ
CollectedClientDataの検証
authenticator dataの検証
attestation statementの検証
https://w3c.github.io/webauthn/#sctn-registering-a-new-credential�https://w3c.github.io/webauthn/#sctn-attestation-formats
© FIDO Alliance 2024
51
サーバ側に保存しておくもの
他のもまぁ必要があると思えば...
© FIDO Alliance 2024
52
よくある誤解
© FIDO Alliance 2024
53
初級編
生体認証がサーバに保存されちゃう?
�
Passkey providerは、自由にパスキーにアクセスできちゃう?
© FIDO Alliance 2024
54
中級編
パスキーはひとつしか作れない?
�
トラッキングに利用できる?
© FIDO Alliance 2024
55
上級編
synced passkeyは、共有されるから安全ではない?
synced passkeyは、atteStmtないから安全ではない?
© FIDO Alliance 2024
56
パスキーの管理
© FIDO Alliance 2024
57
登録されてるパスキーをどう見せるか? (UX Guidelines)
© FIDO Alliance 2024
58
登録されてるパスキーをどう見せるか? (UX Guidelines)
登録・削除
パスキーの名前・icon
登録時の情報
利用情報
© FIDO Alliance 2024
59
登録されてるパスキーをどう見せるか? (Google)
© FIDO Alliance 2024
60
登録されてるパスキーをどう見せるか? (Google)
登録・削除
パスキーの名前・icon
登録時の情報
利用情報
© FIDO Alliance 2024
61
それぞれの情報をどうやって取得するか?
© FIDO Alliance 2024
62
パスキー登録への誘導 (おまけ)
© FIDO Alliance 2024
63
どのように登録に誘導するか?
UX Guidelines
© FIDO Alliance 2024
64
どのように登録に誘導するか?
実際のRPの例
WWDC 24: Safari 18 beta adds support for using mediation=conditional for web authentication credential creation. This allows websites to automatically upgrade existing password-based accounts to use passkeys. Learn more by watching Streamline sign-in with passkey upgrades and credential managers at WWDC24�
© FIDO Alliance 2024
65
どのように登録に誘導するか?
色々あるけど結局どれをやれば?
導入目的 | スタンス | 使う対策 (例) |
UX改善 | 登録させたい | ・アカウント設定画面 ・パスワードリカバリ時訴求 ・My pageアクセス時訴求 |
SMS OTPコスト削減 | 積極的に登録させたい | ・アカウント設定画面 ・パスワードリカバリ時訴求 ・My pageアクセス時訴求 ・アカウント作成時 ・ログイン直後の訴求 |
Phishing対策 | ガチ積極的に登録させたい | ・アカウント設定画面 ・パスワードリカバリ時訴求 ・My pageアクセス時訴求 ・アカウント作成時 ・ログイン直後の訴求 ・特定の機能利用直前 / 必須条件 |
© FIDO Alliance 2024
66
パスキーの認証フロー�超概観
NRIセキュアテクノロジーズ株式会社 古川英明
© FIDO Alliance 2024
67
© FIDO Alliance 2024
67
目次
© FIDO Alliance 2024
68
ユーザー体験 主なパスキー呼び出し方法とそれぞれの導線概観
ID入力欄
Conditional UI
パスキーで�ログインボタン
ID入力からの�パスキー要求
FIDOアライアンスの�UXガイドライン[1]でも推奨
※ただしWindows 10などの
一部環境では利用不可能
IDを基にし、サーバー側が、
利用者に要求するパスキーを絞り込む
パスキーでログイン
ID入力欄
ログイン
※UIはOSやブラウザ、および�バージョンによっても異なります
パスキーを使用しますか?
ユーザーID A
ユーザーID B
ユーザー検証[2]
パスキーを使用しますか?
ユーザーID A
ユーザーID B
ユーザー検証[2]
ユーザー検証[2]
[1] https://fidoalliance.org/design-guidelines/patterns/sign-in-with-a-passkey/
[2] ユーザー検証については実施有無も含めて後述
© FIDO Alliance 2024
69
Conditional UI
ID入力欄
出所) https://developers.google.com/codelabs/passkey-form-autofill?hl=ja#5
© FIDO Alliance 2024
70
パスキーでログインボタン
ログイン
© FIDO Alliance 2024
71
ID入力からのパスキー要求
ID入力欄
© FIDO Alliance 2024
72
ID入力からのパスキー要求 サーバー側の実装コード例(一部)
© FIDO Alliance 2024
73
ID入力からのパスキー要求 クライアント側の実装コード例
出所) https://glitch.com/edit/#!/passkeys-codelab?path=public%2Fclient.js
© FIDO Alliance 2024
74
認証時のデータの流れの概観(原図)
© FIDO Alliance 2024
75
認証時のデータの流れの概観⓪
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
認証開始
出所) https://www.w3.org/TR/webauthn-3 を基に作成
0
© FIDO Alliance 2024
76
認証時のデータの流れの概観①
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
�challenge
timeout
rpId
allowCredentials
userVerification
hints
attestation
attestationFormats
extensions
� 認証器が他のデータとともに署名するチャレンジ
(任意) 完了を待つミリ秒での時間
(任意) “Relying Party”側が主張するRP ID
クライアントと認証器側で要検証
(任意)クライアントが認証に用いる認証器を� 探索するための値
(任意)ユーザー検証を行うか
(任意)ユーザーエージェントをガイドする� ための要素(PublicKeyCredentialHints)
(任意)attestation搬送の指定
(任意)attestationステートメント形式の指定
(任意)クライアントと認証器への追加の処理要求
PublicKeyCredentialRequestOptions
サーバー側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
1
© FIDO Alliance 2024
77
PublicKeyCredentialRequestOptionsの例
© FIDO Alliance 2024
78
認証時のデータの流れの概観②
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
rpId
clientDataHash
ほか
WebAuthnのRelying Partyを�識別するドメインの文字列
シリアル化されたclientDataのハッシュ
authenticatorGetAssertionオペレーション
clientData:type(処理の種類)、challenge (Base64エンコードされた①のchallenge) 、origin、top origin(要求元のトップレベルorigin)、crossOrigin(同一オリジンかのブール値)
クライアント側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
2
© FIDO Alliance 2024
79
authenticatorGetAssertionの入力値
出所) https://www.w3.org/TR/webauthn-3 一部加工
シリアル化されたclientDataのハッシュが含まれる
© FIDO Alliance 2024
80
clientData内にサーバーからのチャレンジなどがある。
© FIDO Alliance 2024
81
認証時のデータの流れの概観③
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
ユーザー検証「利用者を識別すること」 を目的とした「認証器がクレデンシャル生成ないしアサーションの取得のためのローカルでの許可」の確認(PINやパスワードの入力、生体情報での識別)と、authenticatorDataとclientDataHashを結合してクレデンシャルのプライベート鍵を用いてassertion signatureを生成
クライアント側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
3
© FIDO Alliance 2024
82
認証時のデータの流れの概観④
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
authenticatorData�
signature
attestationオブジェクトselectedCredential.userHandle
rpIdのハッシュ、フラグ、署名回数、attestedCredentialData、extensions �assertion/attestationの署名
attestation
ユーザーアカウントの識別子�allowCredentialsが空の場合は必須
クライアント側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
4
© FIDO Alliance 2024
83
認証時のデータの流れの概観⑤
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
AuthenticatorAssertionResponse
clientDataJSON
�authenticatorData
signature
type(処理の種類)、challenge (Base64エンコードされた①のchallenge) 、origin、top origin(要求元のトップレベルorigin)、crossOrigin(同一オリジンかのブール値)
rpIdのハッシュ、フラグ、署名回数、�attestedCredentialData、extensions�assertion/attestationの署名
クライアント側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
5
© FIDO Alliance 2024
84
認証時のデータの流れの概観⑥
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
“Relying Party”のサーバー
サーバー側で検証
clientDataJSON
�authenticatorData
signature
type(処理の種類)、challenge (Base64エンコードされた①のchallenge) 、origin、top origin(要求元のトップレベルorigin)、crossOrigin(同一オリジンかのブール値)
rpIdのハッシュ、フラグ、署名回数、�attestedCredentialData、extensions�assertion/attestationの署名
サーバー側処理
出所) https://www.w3.org/TR/webauthn-3 を基に作成
6
© FIDO Alliance 2024
85
認証時のデータの流れの概観 全体像
“authenticator”(認証器)
ブラウザ�(クライアント)
“Relying Party”の�JavaScriptアプリケーション
WebAuthnAPI
“Relying Party”のサーバー
認証開始
�challenge
timeout
rpId
allowCredentials
userVerification
hints
attestation
attestationFormats
extensions
1
0
AuthenticatorAssertionResponse
5
2
4
authenticatorData�
signature
attestationオブジェクトselectedCredential.userHandle
3
ユーザー検証「利用者を識別すること」 を目的とした「認証器がクレデンシャル生成ないし�アサーションの取得のためのローカルでの許可」の確認(PINやパスワードの入力、生体情報での識別)、�authenticatorDataとclientDataHashを結合してクレデンシャルのプライベート鍵を用いて�assertion signatureを生成
rpId
clientDataHash
ほか
6
サーバー側で検証
� 認証器が他のデータとともに署名するチャレンジ
(任意) 完了を待つミリ秒での時間
(任意) “Relying Party”側が主張するRP ID
クライアントと認証器側で要検証
(任意)クライアントが認証に用いる認証器を� 探索するための値
(任意)ユーザー検証を行うか
(任意)ユーザーエージェントをガイドするための� 要素(PublicKeyCredentialHints)
(任意)attestation搬送の指定
(任意)attestationステートメント形式の指定
(任意)クライアントと認証器への追加の処理要求
PublicKeyCredentialRequestOptions
clientDataJSON�authenticatorData
signature
(②の下を参照)
(④を参照)
(④を参照)
WebAuthnのRelying Party(「WebAuthn APIで�ユーザーを登録と認証するWebアプリケーションのエンティティ」)を識別するドメインの文字列
シリアル化されたclientDataのハッシュ
authenticatorGetAssertionオペレーション
rpIdのハッシュ、フラグ、署名回数、�attestedCredentialData、extensions�assertion/attestationの署名
attestation
ユーザーアカウントの識別子�allowCredentialsが空だった場合は必須
clientData:type(処理の種類)、challenge (Base64エンコードされた①のchallenge) 、origin、top origin(要求元のトップレベルorigin)、crossOrigin(同一オリジンかのブール値)
出所) https://www.w3.org/TR/webauthn-3 を基に作成
© FIDO Alliance 2024
86
クロスデバイス認証(2024年6月現在) 概要
Android端末
パスキー
iOS/iPadOS端末
パスキー
Android端末
iOS/iPadOS端末
macOS端末
Windows端末
© FIDO Alliance 2024
87
クロスデバイスでの認証 導線概観
パスキーを選択する
他の端末のパスキーを使用する
セキュリティキーを使用する
パスキーを持つ端末で�QRコードをスキャン
パスキー
ユーザー検証
※Android端末の場合は�Googleレンズアプリで�QRコードをスキャン
※UIはOSやブラウザ、および�バージョンによっても異なります
© FIDO Alliance 2024
88
パスキーにまつわるよくある誤解を解く
© FIDO Alliance 2024
89
鍵(パスキー)自体が送られる訳では無い
© FIDO Alliance 2024
90
鍵自体が送られないからフィッシング耐性があるわけではない
© FIDO Alliance 2024
91
利用者が必ずしも何も覚えなくて良いというわけではない
生体情報
画面ロック解除�PIN/パスワード
© FIDO Alliance 2024
92
認証時はユーザー検証(“user verification”)について指定が可能
© FIDO Alliance 2024
93
認証器でのユーザー検証の結果はauthenticatorData内のフラグに包含
© FIDO Alliance 2024
94
Q&Aタイム
© FIDO Alliance 2024
95
© FIDO Alliance 2024
95
Thank you
© FIDO Alliance 2024
96
© FIDO Alliance 2024
96