PASETO暗黙アサーション(v3 / v4)

PASETO v3とv4の暗黙アサーションとは何か、フッターとどう違うか、より強いコンテキストバインディングのために使うべき場面。

Feature

詳細な説明

暗黙アサーションはPASETO v3とv4で追加された機能で、発行者と検証者がトークンの署名/タグに追加のコンテキストをバインドできるようにします — そのコンテキストをワイヤーに乗せることなく。

仕組み:

v3/v4トークンを署名または暗号化するとき、APIは追加の任意バイトパラメータ — 暗黙アサーション — を受け付けます。その値はヘッダー、ペイロード、フッターと並んで事前認証エンコーディング(PAE)に投入されます。結果:署名/タグは暗黙アサーションに依存しますが、アサーション自体はトークンで送信されません

検証するためには、検証者が独立に同じ暗黙アサーションバイトを提供しなければなりません。発行者と検証者が一致しないと、ワイヤー上のすべてのバイトが変わっていなくても検証は失敗します。

これが有用な理由:

暗黙アサーションは、公開したくないコンテキストにトークンをバインドできます。例:

  • マルチテナントシステムのテナントID — 両側とも操作中のテナントを知っているが、ワイヤートークンでテナント名を漏らす必要はない。
  • チャネルバインディング — 発行された接続のTLSエクスポーター値にトークンをバインドし、別の接続でリプレイされないようにする。
  • 設定バージョン — 特定のサーバー設定バージョンにトークンをバインドし、設定ロールバックで未処理トークンが自動的に無効化される。

暗黙アサーション vs フッター:

両方とも認証されますが、ワイヤーに乗るのはフッターだけです。検証者がディスパッチのために値を読む必要がある場合(例:kid で鍵を検索する)はフッターを使います。両側がすでに帯域外で値を知っており、漏らさずにバインドしたい場合は暗黙アサーションを使います。

v1とv2にはこの機能はない:

この機能はv3+のみです。v1とv2はPAEでヘッダー + ボディ + フッターのみを使います。暗黙アサーションが必要なら、それもv3またはv4に移行する別の理由になります。

よくある落とし穴:

アサーションバイトは正確にマッチします — 解析や正規化はありません。発行者と検証者がアサーションを異なって計算すると(例:一方が末尾改行を含むが他方は含まない)、検証は紛らわしい署名エラーで失敗します。両側で常に単一の正規化エンコーディング関数を使ってください。

ユースケース

マルチテナントSaaSが暗黙アサーション経由で発行されるすべてのトークンをテナントIDにバインド — 検証パスがたまたま鍵を共有していても、テナントAから漏れたトークンをテナントBに対してリプレイできません。

試してみる — PASETO Decoder

フルツールを開く