パスキー / WebAuthn 検査

WebAuthn 資格情報 JSON をデコードし、パスキーを作成せずにクライアントデータ、認証器フラグ、カウンター、AAGUID、COSE キー項目を検査します。

ブラウザ内でローカルに実行
資格情報データはこのブラウザ内でのみ解析されます。このページは資格情報を作成せず、navigator.credentials を呼び出さず、サーバーチャレンジに対して署名を検証しません。
WebAuthn 資格情報 JSONシリアル化された PublicKeyCredential レスポンス
デコードされたクライアントデータと認証器データ

セレモニーの証拠を検査し、サーバー側で検証する

本番環境のリライングパーティは、チャレンジ、オリジン、RP ID ハッシュ、ユーザー存在確認または検証ポリシー、署名、アルゴリズム、アテステーションポリシー、署名カウンターの動作を検証する必要があります。

WebAuthn 資格情報をデコードしてフラグを確認する方法

このページは、シリアル化された PublicKeyCredential(リライングパーティが navigator.credentials.create() または navigator.credentials.get() から受け取る JSON)を読み取り、その両方を確認できるフィールドに分解します。登録やアサーションが失敗したとき、実際に何が送られてきたかを確かめる最短の方法です。clientDataJSON は Base64URL からデコードして解析し、認証器データは RP ID ハッシュ、フラグバイト、署名カウンター、および登録の場合は AAGUID、資格情報 ID、COSE 公開鍵に分けて表示します。

処理はすべてブラウザー内で完結します。このページは navigator.credentials を呼び出さず、リライングパーティに接続せず、資格情報をどこにも送信しません。デコードは検証ではありません。署名、アテステーション文、チャレンジの照合はサーバー側の仕事です。

  1. 最初のパネルに資格情報の JSON を貼り付けます。id、rawId、type、response を含む完全なオブジェクトでも、response オブジェクトだけでも受け付けます。
  2. 「資格情報を検査」を押します。概要にセレモニーの種類、オリジン、チャレンジ、クロスオリジン、資格情報 ID、RP ID ハッシュ、署名カウンター、AAGUID、COSE 鍵の各フィールドが並び、UP・UV・BE・BS・AT・ED のチップが点灯します。
  3. 比較用の既知の資格情報が欲しいときは「認証の例」または「登録の例」を押します。認証の例は 37 バイトの authenticatorData そのもので、登録の例は認証器データ・ゼロの AAGUID・P-256 鍵を CBOR マップに格納した attestationObject です。
  4. 値とあわせて検出結果の一覧も読んでください。デコードしたバイト列では証明できないこと — チャレンジをサーバーセッションと照合したか、オリジンが許可リストに一致したか、署名を検証したか — が並びます。
  5. 「レポートをコピー」で JSON レポートを持ち出し、「クリア」でパネルを空にして概要を初期状態に戻してから次の資格情報を処理します。

デコードされた各フィールドの意味

フラグ、カウンター、識別子

フラグバイトは資格情報ではなくセレモニーを表します。UP はユーザーが存在したこと、UV は PIN や生体認証で検証されたこと、BE は資格情報を別の認証器にコピーできること、BS は現在コピーされていることを示し、同期されるパスキーでは両方が立ちます。AT は登録時だけ存在するアテステーション対象データ(AAGUID、資格情報 ID、公開鍵)、ED は拡張データを示します。

署名カウンターは認証器がアサーションごとに増やす 32 ビットの符号なし整数です。保存した値と比較するのが古典的なクローン検出ですが、まったく動かないカウンターだけでは何も証明できません。多くのプラットフォーム認証器は常に 0 を返します。RP ID ハッシュは資格情報を作成したリライングパーティ ID の SHA-256 で、期待値と照合することで、あるサイトで取得された資格情報が別のサイトで再利用されていないことを確認できます。

各フィールドの出どころ

clientDataJSON は、ブラウザーがチャレンジ・オリジン・セレモニーの種類(webauthn.create または webauthn.get)から組み立てた Base64URL の JSON です。このページはデコードして解析し、ブラウザーが別ページへの埋め込みとして扱った場合は crossOrigin を報告します。その後に続くのはコンパクトなバイナリ構造で、32 バイトの RP ID ハッシュ、1 バイトのフラグ、4 バイトのカウンター、そして AT フラグが立っている場合だけアテステーション対象データが並びます。

登録のレスポンスには attestationObject が含まれ、その CBOR マップが同じ認証器データを authData として保持します。このページは CBOR マップをたどって取り出します。隣にあるアテステーションの形式と文は表示も検証も行いません。ブラウザーがレスポンスの周囲に付ける transports や clientExtensionResults もレポートには含まれません。

サーバー側で必要な処理

デコードされた資格情報は証拠であって証明ではありません。リライングパーティは、そのセッションで発行したチャレンジと照合し、オリジンが自分自身であることを確認し、RP ID ハッシュを期待する RP ID と比較し、登録時に保存した公開鍵で認証器データと clientDataJSON の SHA-256 に対する署名を検証する必要があります。

さらに、ユーザー検証とアテステーションの方針を適用し、受け入れるアルゴリズムを制限し、署名カウンターとバックアップのフラグが自らの脅威モデルにとって何を意味するかを決める必要があります。このページが名前を付ける COSE の値は ES256、EdDSA、ES384、ES512、PS256、PS384、PS512、RS256、RS384、RS512 と、P-256、P-384、P-521、Ed25519、Ed448 の曲線で、それ以外は生の数値として表示します。これは表示上のラベルであり、方針の判断ではありません。

最近使ったツール: