「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- Web Authentication API (WebAuthn?) は
詳細 †
- W3C で定義されている使用する (主な) API の名前は、
- セキュアコンテキスト (https or localhost)であることを必要とし、
ブラウザがセキュアコンテキストで動作していない場合は利用できない。
登場人物 †
- Relying Party Identifier(RP ID):
- WebAuthn? Relying Partyを識別する有効なドメイン文字列
- スキームにはhttpsが必要(ポート番号に制限はない)。
- FQDN名か、ドメイン接尾辞の何れかになる。
https://login.example.com:1337なら、
- FQDN名: [login.example.com]
- ドメイン接尾辞: [example.com]
認証器(Authenticator) †
- 認証器アテステーション(Authenticator Attestation)
- 認証器のデータを検証する作業。
- アテステーション証明書: アテステーションするために使用する秘密鍵を含むX.509証明書。
- レート制限
- ブルートフォース攻撃に対する制御を実装するプロセス。
- 限度に達すると、
- 指数関数的に増加する遅延を課すか、
- または現在の認証方式を無効にし、
- 利用可能であれば異なる認証係数を提供する。
クライアント †
- ブラウザ実装など。
- ユーザエージェントに(全体的にまたは部分的に)実装された中間的なエンティティ
仕組み †
儀式であり、
この儀式では、
が共同した、
ユーザの存在またはユーザ確認のテスト(式典)
が必要になる。
各種鍵(Credential) †
- Resident Credential (Client-side-resident Public Key Credential Source)
FIDO2.0 から新しく追加された、キーの中にユーザ情報を保存する機能。
ユーザの存在またはユーザ確認のテスト(式典) †
登録(RegistrationでAttestation)と、
認証(AuthenticationでAssertion)では、
以下のような、存在 vs 認証を行う。
- ユーザ存在テスト
- ユーザが認証器と簡単に接触することによってブール結果が生成される。
- ユーザ存在テストが正常に完了すると、ユーザは「UP: User Present」と言われる。
- ユーザ検証
- authenticatorMakeCredential? + authenticatorGetAssertion?で行われる。
- ユーザ検証プロセスが正常に完了すると、ユーザは「UV: User Verified」と言われる。
- 登録式(Registration Ceremony)
- 認証式(Authentication Ceremony)
依存 †
データ †
- CBOR
- オブジェクトをバイナリ・シリアライズする使用
- 基礎となるデータモデルは、JSONデータモデル[RFC4627]
- 参考
- CDDL
- CBOR表記規則(CBOR [RFC7049]を表現する表記法)
- JSONデータ構造の記述にも使用できる。
- CDDLの目標
- (G1)CBORデータ構造の全体的な構造の明瞭な記述を提供する。
- (G2)自由度をCBORデータ形式で表現する柔軟性。
- (G3)必要に応じてフォーマットの選択を制限する可能性がある[_形式]。
- (G4)共通のCBORデータ型および構造を表現できること。
- (G5)人と機械が読み書き可能であること。
- (G6)データフォーマット準拠の自動チェック。
- (G7)さらなる処理のためにCBORデータから特定の要素を抽出する。
- COSE
- CBORオブジェクト署名と暗号化(COSE)[RFC8152]。
- 参考
- ArrayBuffer?
- ECMAScriptによって定義されている。
- JavaScriptでバイナリを扱うために生まれた。
- 画像・音声処理などで利用されている。
- 参考
その他 †
- HTML
- DOM
- ECMAScript
- Web IDL: Webブラウザーで実装するためのAPIを記述するためのIDL
- FIDO AppID:
呼び出し元アプリケーションのFacetIDを決定し、呼び出し元のFacetIDが
AppIDに対して許可されているかどうかを判断するアルゴリズムを定義する。
API †
登録(Attestation): navigator.credentials.create()メソッド †
内部で、authenticatorMakeCredential?を呼び出す。
引数:PublicKeyCredentialCreationOptions? †
- challenge
- ランダムな情報の大きなバッファー(例えば100バイト以上)が絶対に重要。
- 登録過程のセキュリティを確保するためにサーバ上で生成する必要がある。
- pubKeyCredParams?
// このRPはES256またはRS256の公開鍵を受け入れますが、ES256公開鍵を優先します。
pubKeyCredParams:
[
{
type: "public-key",
alg: -7 // "ES256" as registered in the IANA COSE Algorithms registry
},
{
type: "public-key",
alg: -257 // Value registered by this specification for "RS256"
}
],
- "none"(既定値)
ユーザ名/パスワードをFIDO2に切り替える場合。
(FIDO2はパスワードよりも優れていると考える場合)
- "indirect"
スマートカードまたはUAFから移行する場合、
認証器の信頼性をattestation statement から確認する必要がある。
クライアントがattestation statement を取得する方法を決定できる。
- "direct"
スマートカードまたはUAFから移行する場合、
認証器の信頼性をattestation statement から確認する必要がある。
サーバーがattestation statement を必要とすることを示す。
- authenticatorSelection
色々なオプションを指定、その一つにResident Key のサポートなどがある。
戻り値:AuthenticatorAttestationResponse? †
厳密には、PublicKeyCredential?.responseに、
AuthenticatorResponse? <- AuthenticatorAttestationResponse? を含む、
PublicKeyCredential? に解決する Promiseを返す。
- id(rawId): GlobalにUniqueなPublicKeyCredential?のID(credentialId)
- type: public-key(このUseCase?では固定)
- AuthenticatorAttestationResponse?のプロパティ
- clientDataJSON: ArrayBuffer?型、読み取り専用
- AuthenticatorResponse?から継承
- 認証器のauthenticatorMakeCredential?()メソッドの戻り値
- attestationObject: ArrayBuffer?型、読み取り専用
id(rawId) = PublicKeyCredential?のID(credentialId)に対応した、公開鍵と他の認証データ
- fmt:アテステーションステートメントの形式を示すテキスト文字列
("packed"、 "tpm"、 "android-key"、 "android-safetynet"、 "fido-u2f"、"none")
- attStmt:"fmt"で定義された形式のアテステーションステートメント
- 参考
- PublicKeyCredential? interface
- AuthenticatorResponse? interface
- AuthenticatorAttestationResponse? interface
認証(Assertion): navigator.credentials.get()メソッド †
内部で、authenticatorGetAssertion?を呼び出す。
引数:PublicKeyCredentialRequestOptions? †
- challenge
- ランダムな情報の大きなバッファー(例えば100バイト以上)が絶対に重要。
- 登録過程のセキュリティを確保するためにサーバ上で生成する必要がある。
- allowCredentials
- type:"public-key"
- id:id(rawId) = PublicKeyCredential?のID(credentialId)
- transports: [] (通信のヒントらしいが、空の配列が指定されている)
- userVerification
ユーザー検証要件の列挙型
- "required"
- "preferred"
- "discouraged"
- 参考
- PublicKeyCredentialRequestOptions?
戻り値:AuthenticatorAssertionResponse? †
厳密には、PublicKeyCredential?.responseに、
AuthenticatorResponse? <- AuthenticatorAssertionResponse? を含む、
PublicKeyCredential? に解決する Promiseを返す。
- id(rawId): GlobalにUniqueなPublicKeyCredential?のID(credentialId)
- type: public-key(このUseCase?では固定)
- AuthenticatorAssertionResponse?のプロパティ
- clientDataJSON: ArrayBuffer?型、読み取り専用
- AuthenticatorResponse?から継承
- 認証器のauthenticatorGetAssertion?()メソッドの戻り値
- authenticatorData: ArrayBuffer?型、読み取り専用
- signature: ArrayBuffer?型、読み取り専用
- userHandle: ArrayBuffer?型、読み取り専用、nullable
- 参考
- PublicKeyCredential? interface
- AuthenticatorResponse? interface
- AuthenticatorAssertionResponse? interface
実装例 †
サーバ実装パターン †
IdPが実装 †
IdPに集約可能で楽。
RP & BaaS †
折衷案(RPがWebAuthn認証、BaaSが公開鍵の管理)
RPが実装 †
IdPのコントロールが効かない場合。
WebAuthn?で実現できるUX †
参考 †
w3c †
MDN - Web APIs †
Credential Management API †
Web Authentication API †
Credential Management API中のPublicKeyCredential?を拡張したもの。
webauthn.org †
OAuth0 †
仕組みをアニメーションで解り易く説明している。
.NET standard の Web Authentication API対応ライブラリ。
Yubico †
blog.jxck.io †
enjoy struggling †
(株)ソフト技研 †
ritou †
Speaker Deck †
r-weblife †
Qiita †
enjoy struggling †
Tags: :IT国際標準, :認証基盤