FIDOとPasskeyについて

機械学習技術 人工知能技術 アルゴリズム デジタルトランスフォーメーション技術 プログラミング技術 数学 暗号化とセキュリティとデータ圧縮 本ブログのナビ
FIDO

FIDO(Fast Identity Online)は、より安全で簡単なオンライン認証を目指す標準化フレームワークで、パスワードに依存しない認証方法を提供し、セキュリティやユーザーエクスペリエンスの向上を目指すものとなる。

FIDOは公開鍵暗号を基盤にした認証プロトコルを利用しており、デバイスがユーザーの認証データを登録する際に、公開鍵(サーバーに保存)と秘密鍵(デバイスに保存)のペアを生成する。この秘密鍵を使って認証時にデジタル署名を行い、その署名を公開鍵で検証することでユーザー認証が行われる。このとき、秘密鍵がサーバーに保存されないため、仮にサーバーが攻撃されても鍵そのものが漏洩するリスクはない。

FIDOとはより

FIDOには以下に示すようないくつかの規格が存在し、用途に応じて異なるアプローチを提供している。

  • FIDO UAF (Universal Authentication Framework)
    – 主にパスワードを使用しない認証にフォーカス。
    – 生体認証(指紋、顔認証など)やPINコードなどを利用。
  • FIDO U2F (Universal Second Factor)
    – 2要素認証に特化。
    – セキュリティキーなどのハードウェアトークンを利用。
    – 主にオンラインサービスの追加のセキュリティレイヤーとして使用。
  • FIDO2 (WebAuthn + CTAP)
    – 最新の規格で、FIDO UAFとU2Fを統合し進化させたもの。
  • WebAuthn(Web Authentication API)
    – Webブラウザとオンラインサービスが連携し、生体認証やセキュリティキーを使用可能。
    – 多くの主要ブラウザやデバイスが対応。
  • CTAP(Client to Authenticator Protocol)
    – デバイス(例:スマートフォンやセキュリティキー)とブラウザやOS間の通信を規定。

FIDOのメリットとしては、以下のようなものがある。

  • セキュリティの向上: パスワードを不要とし、フィッシング攻撃やパスワード漏洩のリスクを削減。
  • ユーザー体験の改善: パスワード入力の手間が省け、生体認証やセキュリティキーのワンタッチ認証が可能。
  • 広範な対応: Google、Microsoft、Appleなどの主要プラットフォームがサポート。

FIDOの活用例としては、Webサイトやアプリケーションでのログイン時に利用するログイン認証、電子商取引やデジタル決済における本人確認を行う支払い認証、従業員のアクセス管理やセキュリティ向上するための企業内システムでの活用などがある。

現在は、FIDO2が広く普及し始めており、ブラウザやOSとの互換性が向上し、Appleの「パスキー(Passkey)」やWindows HelloなどがFIDOを基盤にしている状況にある。

パスキー(Passkey)

パスキー(Passkey)は、Apple、Google、Microsoftなどの主要テクノロジー企業が推進する、パスワード不要の認証手段で、FIDO2規格に基づいており、セキュリティと使いやすさを両立する新しい認証方式として注目されているものとなっている。

パスキーって何?より

パスキーは、公開鍵暗号方式を利用した認証方法で、以下の特徴を持つ。

  • 公開鍵と秘密鍵のペアを利用:サーバーには公開鍵だけが保存され、秘密鍵はユーザーのデバイス(スマートフォンやPC)に安全に保存される。
  • 生体認証やデバイスPINを利用:ユーザー認証時には、デバイス内の秘密鍵を利用して署名を行い、サーバー側でその署名を公開鍵で検証する。
  • 同期可能:AppleのiCloud、Googleのアカウント同期などを通じて、複数デバイス間で安全にパスキーを共有できる。

パスキーの特徴としては、以下のものがある。

  1. セキュリティの向上
    • パスワード不要:パスワードが存在しないため、フィッシング攻撃やリスト型攻撃が無効化される。
    • 秘密鍵のローカル保存:秘密鍵はデバイスから外に出ないため、データベース漏洩の影響を受けない。
  2. 使いやすさ
    • 生体認証:指紋認証や顔認証を利用して、スムーズなログインが可能。
    • 同期機能:主要なプラットフォームでは、複数デバイス間でのパスキー共有が可能で、利便性が高まっている。
  3. プラットフォーム間の互換性
    • Apple、Google、MicrosoftがFIDOアライアンスのもとで協力しており、クロスプラットフォームでの利用が可能。

パスキーを使う際には以下のようなステップを踏む。

  1. 初回登録
    1. サービス(例: Webサイトやアプリ)でアカウント登録時に、パスキーを設定。
    2. デバイスで公開鍵と秘密鍵が生成され、公開鍵がサービス側に保存される。
  2. ログイン時
    1. サイトやアプリが認証要求を送信。
    2. ユーザーがデバイスで生体認証やPINを利用して秘密鍵を使用。
    3. サーバーが公開鍵で署名を検証し、ログインを許可。

パスキーの実用例としてはAppleの「Passkey」やGoogleのパスキー、Microsoftの「Windows Hello」などがある。

パスキーは、オンライン認証の未来として期待されており、主要なテクノロジープラットフォームでのサポートが拡大中な技術となる。今後ユーザー体験の向上やセキュリティ強化を目指して、多くのWebサイトやアプリが今後対応することが見込まれている。

実装するための手順

パスキー(Passkey)を実装するには、FIDO2規格に基づく認証プロトコル(WebAuthn)を利用するのが一般的となる。以下に、基本的な流れを示す。

1. 必要な知識とツール

前提知識

  • WebAuthn(Web Authentication API)についての基本的な理解。
  • 公開鍵暗号方式に関する基礎知識。

必要なツール

  • サーバーサイド環境: Node.js、Python、Java、GoなどでWebAuthn対応ライブラリが利用可能。
  • フロントエンド環境: Webブラウザ(Chrome, Edge, Safari, Firefox)でWebAuthn APIを使用。

サーバーライブラリ例

2. 実装フロー

以下は、パスキーの基本的な登録と認証の流れとなる。

(1) パスキーの登録

  1. ユーザー登録リクエスト
    • サーバーがWebAuthn APIを使用して、クライアントにPublicKeyCredentialCreationOptionsを生成。
    • このオプションには、以下の情報を含める。
      • ユーザーID
      • サーバーのRP ID(例: ドメイン)
      • サポートする認証器情報(例: 生体認証、セキュリティキー)
  2. クライアント側でキーの生成
    • フロントエンドでnavigator.credentials.create()を呼び出し、パスキーを生成。
const options = {
    publicKey: {
        challenge: new Uint8Array(32), // サーバーが生成したチャレンジ
        rp: { name: "Example" },
        user: {
            id: new Uint8Array([1, 2, 3, 4]),
            name: "user@example.com",
            displayName: "User Example"
        },
        pubKeyCredParams: [{ alg: -7, type: "public-key" }]
    }
};
const credential = await navigator.credentials.create(options);

   3. 公開鍵をサーバーに送信

    • クライアントは生成した公開鍵をサーバーに送信し、サーバーがデータベースに保存。

(2) パスキーによる認証

  1. 認証リクエスト
    • サーバーがPublicKeyCredentialRequestOptionsを生成し、クライアントに送信。
    • チャレンジや対象の公開鍵情報を含める。
  2. クライアント側で署名生成
    • フロントエンドでnavigator.credentials.get()を呼び出し、秘密鍵で署名を作成。
const options = {
    publicKey: {
        challenge: new Uint8Array(32), // サーバーが生成したチャレンジ
        allowCredentials: [
            { id: credentialId, type: "public-key" }
        ]
    }
};
const assertion = await navigator.credentials.get(options);

 (3) 署名をサーバーに送信

    • クライアントが署名データをサーバーに送信。
    • サーバーは公開鍵を使用して署名を検証。

 (4) ログイン成功

    • 検証が成功すればユーザー認証が完了。

3 必要なバックエンドの実装

登録時のデータ保存

  • ユーザーIDと公開鍵を保存。
  • RP IDや認証器タイプ、その他メタデータも記録。

認証時の署名検証

  • サーバーは公開鍵で署名を検証し、チャレンジの一致を確認。

4. 実装のポイント

  1. セキュリティ
    • サーバー間通信にはHTTPSを使用。
    • サーバーでチャレンジの有効期限を設定。
  2. デバイスのサポート
    • モバイル端末やPC、セキュリティキーなど複数デバイスでの使用を考慮。
  3. ユーザーエクスペリエンス
    • 生体認証などを活用してスムーズなログインを提供。

5. 実装例とリソース

デモプロジェクト

  • WebAuthn.io
    パスキー認証のデモサイトとソースコード。

GitHubプロジェクト

  • SimpleWebAuthn
    Node.jsベースでシンプルなWebAuthnライブラリ。

公式リソース

参考図書

パスキー(Passkey)やWebAuthn、FIDO2について理解を深めるために役立つ参考図書や資料を以下に述べる。

WebAuthn: Explained

WebAuthn Specification

FIDO Alliance

Node.js Cookbook – Fifth Edition: Practical recipes for building server-side web applications with Node.js 22

Python for Security and Networking – Third Edition: Leverage Python modules and tools in securing your network and applications

Web Security for Developers: Real Threats, Practical Defense

Yubico Developer Resources

Google WebAuthn Codelab

コメント

タイトルとURLをコピーしました