著者:五味秀仁、板倉景子
パスワード課題の解決に注力する業界団体FIDO(ファイド)アライアンスは、
フィッシング攻撃に耐性のある、シンプルで堅牢な認証の展開を推進してい
ます。その新しい仕様「FIDO2」は、標準化団体W3Cで策定されるWeb認証仕
様「WebAuthn」(ウェブオースン)を包含し、さらにAndroidとWindowsに加えて、iOSやmacOSにも対応するなど、プラットフォーム拡大を進めています。本特集では、FIDO2の概要や仕組み、最新動向について解説します。
シェルスクリプトマガジン Vol.70は以下のリンク先でご購入できます。![]()
![]()
図8 publicKeyデータの例
{
"publicKey": {
"attestation": "direct",
"authenticatorSelection": {
"authenticatorAttachment": "platform",
"requireResidentKey": false,
"userVerification": "required"
},
"challenge": "bWhMbDgxc1h4Z3B...",,
"excludeCredentials": [],
"pubKeyCredParams": [
{
"alg": -7,
"type": "public-key"
}
],
"rp": {
"id": "example.com",
"name": "Example corporation"
},
"timeout": 60000,
"user": {
"displayName": "Ichiro Suzuki",
"id": [70, 60, ...],
"name": "ichiro.suzuki@example.com”
}
}
}
図9 認証器に登録要求を出すJavaScriptプログラムの例
if (!window.PublicKeyCredential) {
WebAuthn APIが使えない場合の処理
}
// プラットフォーム認証器が使える場合
PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()
.then(function () {
// 以下で設定するのがPublicKeyCredentialCreationOptions
var options = { "publicKey": ... };
return navigator.credentials.create(options);
}).then(function (newCredentialInfo) {
生成されたクレデンシャルの処理
}).catch( function(err) {
エラー処理
});
図10 PublicKeyCredentialデータの例
{
"id": "sL39APyTmisrjh11vghaqNfuru...",
"rawId": "sL39APyTmisrjh11vghaqNf...",
"response": {
"attestationObject": "eyJjaGFsbGVuZ2...",
"clientDataJSON": "o2NmbXRmcGFja2..."
},
"type": "public-key"
}
図11 attestationObject項目に設定される情報の例
{
"fmt": "packed",
"attStmt": {
"alg": -7,
"sig": "MEYCIQDyCG+pKJmcV...",
"x5c": [
"MIICQjCCAcmgAwIBA..."
]
},
"authData": {
"credentialData": {
"aaguid": "vfNjNcR0U8...",
"credentialId": "Y0GeiMghzi...",
(略)
},
(略)
}
}
図12 clientDataJSON項目に設定される情報の例
{
"challenge": "bWhMbDgxc1h4Z3B...",
"origin": "https://example.com",
"type": "webauthn.create"
}
図14 publicKeyデータの例
{
"publicKey": {
"allowCredentials": [
{
"id": "Y0GeiMghzi...",
"type": "public-key"
}
],
"challenge": "lZgXWOY0Go6HxmQP03...",
"rpId": "example.com",
"timeout": 60000,
"userVerification": "required"
}
}
図15 認証器に認証要求を出すJavaScriptプログラムの例
// 以下で設定するのがPublicKeyCredentialRequestOptions
var options = { "publicKey": ... };
navigator.credentials.get(options)
.then(function (assertion) {
アサーションをRPサーバーに返す処理
}).catch(function (err) {
エラー処理
});
図16 PublicKeyCredentialデータの例
{
"id": "Y0GeiMghzi...",
"rawId":"Y0GeiMghzi...",
"response": {
"authenticatorData": "yHxbnq0iOEP3QN0K...",
"clientDataJSON": "eyJjaGFsbG...",
"signature": "NRUVOWSMtH..."
},
}