シェルスクリプトマガジン

特集2 FIDO2の最新動向(Vol.70記載)

著者:五味秀仁、板倉景子

パスワード課題の解決に注力する業界団体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..."
  },
}