🌊

Web認証からFIDO, FIDO2, Google の Passkeysまでの歴史

2023/04/13に公開

1. Web認証の始まり

Web認証は、ユーザーがオンラインサービスに安全にアクセスできるように、IDとパスワードを用いた認証手法が開発されました。しかし、IDとパスワードはフィッシング攻撃やリプレイ攻撃、ブルートフォース攻撃など、さまざまな脅威に対して脆弱であることが判明しました。

2. FIDO AllianceとU2F

この脆弱性に対処するため、2012年にFIDO (Fast IDentity Online) Allianceが設立されました。FIDO Allianceは、より安全な認証手法の標準化を目指す業界団体で、U2F (Universal 2nd Factor)という二要素認証プロトコルを開発しました。U2Fは、パスワード認証に加えて、USBデバイスやNFCデバイスなどの物理的なセキュリティキーを使用して、ユーザーを認証します。

3. FIDO2プロジェクトとWebAuthn

FIDO Allianceは、U2Fをさらに発展させるためにFIDO2プロジェクトを立ち上げました。FIDO2は、WebAuthn(Web Authentication)APIとCTAP(Client-to-Authenticator Protocol)の2つの主要な技術から構成されています。WebAuthnは、ブラウザーとサーバー間で公開鍵暗号を使用した認証を可能にするWeb APIです。CTAPは、FIDO認証器(セキュリティキー)とクライアントデバイス間で通信を行うプロトコルです。

4. WebAuthn(Web Authentication)

WebAuthnは、Web認証API (Web Authentication API) の略で、Webブラウザとサーバー間の安全な認証手段を提供するための標準です。WebAuthnは、ユーザーがパスワードを使用せずにウェブサイトにログインできるように設計されており、より高度なセキュリティ機能を提供します。これにより、フィッシング攻撃やリプレイ攻撃などの脅威からユーザーを守ることができます。

WebAuthnは、公開鍵暗号を使用して、ユーザーと認証器(例:セキュリティキーやスマートフォンの生体認証機能)間で安全な通信を行います。このプロセスは、登録と認証の2つのステップからなります。

WebAuthnのプロセスは、主に登録と認証の2つのステップから構成されます。以下に、それぞれのステップにおける詳細なワークフローを説明します。

登録

  1. ユーザーがWebAuthnに対応したウェブサイトでアカウントを作成または既存のアカウントに新しい認証方法を追加しようとします。
  2. サーバーは、一意のチャレンジとRP(リライング・パーティ)情報を生成し、クライアント(ブラウザ)に送信します。
  3. クライアントは、navigator.credentials.create()関数を呼び出し、チャレンジ、RP情報、ユーザー情報、認証器に関する要件(生体認証の有無など)を渡します。
  4. 認証器は、公開鍵と秘密鍵のペアを生成し、公開鍵とアテステーション(公開鍵の信頼性を証明するデータ)をクライアントに返します。
  5. クライアントは、公開鍵とアテステーションをサーバーに送信します。
  6. サーバーは、アテステーションを検証し、正当な認証器からのデータであることを確認します。
  7. サーバーは、公開鍵をユーザーアカウントに関連付けて保存します。

認証

  1. ユーザーがWebAuthnに対応したウェブサイトにログインしようとします。
  2. サーバーは、一意のチャレンジとRP(リライング・パーティ)情報を生成し、クライアント(ブラウザ)に送信します。
  3. クライアントは、navigator.credentials.get()関数を呼び出し、チャレンジ、RP情報、認証器に関する要件を渡します。
  4. 認証器は、チャレンジと自身の情報(AAGUIDやCredential IDなど)を秘密鍵を使って署名し、署名されたアサーションデータをクライアントに返します。
  5. クライアントは、署名されたアサーションデータをサーバーに送信します。
  6. サーバーは、公開鍵を使ってアサーションデータの署名を検証し、正当なユーザーであることを確認します。
  7. サーバーは、ユーザーを認証し、アクセス許可されたリソースやサービスへのアクセスを許可します。

5. CTAP(Client-to-Authenticator Protocol)

CTAP(Client-to-Authenticator Protocol)は、外部認証機器とクライアントデバイス間の通信プロトコルです。主にFIDO2プロジェクトで利用されており、多要素認証やパスワードレス認証を実現します。以下は、一般的な外部認証機器のいくつかの例です。

  1. YubiKey: Yubico社が開発したセキュリティキーで、USBまたはNFCを介してデバイスに接続されます。YubiKeyは、ワンタイムパスワード(OTP)、U2F、FIDO2など、さまざまな認証方式に対応しています。
  2. Google Titan Security Key: Googleが開発したセキュリティキーで、YubiKeyと同様にUSBまたはNFCを介してデバイスに接続されます。Titanは、FIDO2およびU2F認証方式に対応しています。
  3. Thetis FIDO U2F Security Key: Thetisが開発したセキュリティキーで、USBを介してデバイスに接続されます。このキーは、U2F認証方式に対応しており、多要素認証のために使用されます。
  4. Feitian MultiPass FIDO Security Key: Feitianが開発したセキュリティキーで、Bluetooth、USB、NFCの3つの接続方法をサポートしています。このキーは、FIDO2およびU2F認証方式に対応しています。

これらの外部認証機器は、セキュアな多要素認証やパスワードレス認証を提供することで、オンラインアカウントのセキュリティを向上させる役割を果たします。CTAPは、これらの認証機器とクライアントデバイス間の通信を規定し、ウェブサービスとのセキュアな認証を可能にします。

また、CTAPと同じようにFIDO2プロトコルに基づいたプラットフォーム内蔵認証器というものもあります。

6. GoogleのPasskeys

2022年5月、GoogleのPasskeysが発表された。FIDO2プロトコルに基づいた認証システムで、プラットフォーム内蔵認証器とGoogleパスワードマネージャーを組み合わせて、ユーザーに簡単でセキュアな認証方法を提供します。

プラットフォーム内蔵認証器は、デバイスに組み込まれたセキュリティ機能(指紋認証、顔認証など)を利用して、ユーザーの身元を確認します。これにより、従来のパスワードに依存しない認証が可能となり、セキュリティを向上させます。

一方、Googleパスワードマネージャーは、ユーザーが使用するさまざまなウェブサイトやアプリケーションのパスワードを安全に保存・管理するためのツールです。GoogleのPasskeysが導入されることで、パスワードマネージャーはパスワードの代わりにFIDO2認証情報を管理し、ユーザーがログイン時に必要な情報を提供します。

GoogleのPasskeysを使用すると、ユーザーはパスワードを覚えたり入力したりすることなく、プラットフォーム内蔵認証器を用いて安全にログインできます。また、Googleパスワードマネージャーは、認証情報をセキュアに管理し、ユーザーが簡単にログインできるようにサポートします。これにより、ユーザーはセキュリティを犠牲にすることなく、便利で使いやすい認証方法を利用できるようになります。

Passkeys は新しいテクノロジーであり、サポートされる環境は進化中です。2023 年 1 月現在、macOS と Windows 版 Chrome では、ローカルデバイスにのみパスキーが保存されます。

chrome のパスキーのサポート

実際にアプリケーションにPasskeysを組み込むには

  1. FIDO2ライブラリの導入:
    アプリケーションでFIDO2をサポートするために、FIDO2ライブラリ(たとえば、WebAuthnライブラリやFIDO2ライブラリ)を導入します。
  2. サーバー側の設定:
    サーバー側で、ユーザーの登録と認証に関連するエンドポイントを実装します。これらのエンドポイントでは、FIDO2デバイスによる認証のための情報(チャレンジ、RP IDなど)を生成し、クライアントに送信します。
  3. クライアント側の設定:
    クライアント側では、登録と認証のためのAPIを実装します。これには、navigator.credentials.create()(登録)およびnavigator.credentials.get()(認証)を使用します。これらの関数を使用して、サーバーから取得した情報とともに、FIDO2デバイスとやり取りします。
  4. ユーザー登録:
    ユーザーが新しいPasskeysデバイスを登録する際、アプリケーションは、登録エンドポイントから取得した情報を使用して、デバイスとのやり取りを行います。デバイスは、公開鍵といくつかのメタデータを生成し、これらの情報をアプリケーションに送信します。アプリケーションは、これらの情報をサーバーに送信し、ユーザーのアカウントに関連付けます。
  5. ユーザー認証:
    ユーザーがPasskeysデバイスで認証する際、アプリケーションは認証エンドポイントから取得した情報を使用してデバイスとのやり取りを行います。デバイスは、サーバーが提供したチャレンジに対して署名を生成し、これをアプリケーションに送信します。アプリケーションは、この署名をサーバーに送信し、サーバーは署名を検証して認証を完了します。
  6. UIの更新:
    アプリケーションのUIを更新して、ユーザーがPasskeysデバイスを登録および認証できるようにします。登録用のボタンや認証用のボタンを追加し、それらが適切なAPI呼び出しにリンクされていることを確認します。また、ユーザーに適切なフィードバックや指示を提供するためのUI要素(メッセージ、エラー表示など)も追加します。

実際にデモコードを動かす

参考

Discussion