PASETO v1 — レガシーRSA互換
PASETO v1が存在する理由、何を使うか(AES-256-CTR + HMAC-SHA384、RSA-PSS-2048)、新規システムでv1を選ぶべきでない理由。
詳細な説明
v1 はオリジナルのPASETOバージョンで、現在は純粋にレガシー互換オプションとして存在します。新規システムはv1を使うべきではありません。v1トークンを検査しているなら、ほぼ確実にv3/v4設計より前から動いている長期稼働サービスの一部です。
暗号化方式:
v1.local:暗号化にAES-256-CTR、認証にHMAC-SHA384。末尾の48バイトのタグがHMAC。v1.public:2048ビット鍵のRSA-PSS、MGF1-SHA384、ソルト長48。署名は256バイト。
v1がこのように設計された理由:
PASETOが最初に仕様化されたとき(2018年)、目標はレガシー環境(ChaCha20が利用できない場所、または既存のPKIインフラがすでにRSAだった場所)で動作するJWT等価物でした。AES-CTR + HMACは最大限ポータブルなAEADで、RSA-PSSは最も広くサポートされる署名スキームでした。v1は近代的プリミティブを互換性と引き換えにしたのです。
v1が今ではレガシーである理由:
3つの問題:(1) AES-CTR + HMACは encrypt-then-MACで、これ自体は問題ありませんが、XChaCha20-Poly1305やXChaCha20+BLAKE2bのような組み込みAEADよりも実装が遅くエラーが起きやすい。(2) RSA-PSS-2048署名は256バイトで、Ed25519の64バイトの4倍の大きさ、署名/検証も遥かに遅い。(3) RSA鍵管理はEd25519より難しい(鍵生成が遅い、鍵がかさばる)。
v1トークンの認識:
ヘッダープレフィックス v1.local または v1.public が唯一の信頼できる指標です。256バイトのRSA署名のため、v1.publicトークンはv3/v4トークンより明らかに長くなります。Base64urlデコードされたペイロードが同じプレーンJSONより約340文字以上長ければ、おそらくv1.publicです。
v3/v4への移行:
v1トークンをその場で変換しようとしないでください。通常の認証フロー経由で新しいv4トークンを発行し、移行期間中はv1 + v4を両方受け付け、その後v1の発行を停止します。v1の発行と検証を別々に追跡し、レガシーコードを削除する前にv1パスが完全に死んだことを確認できるようにしましょう。
ユースケース
運用チームが2018年代のサービスからのPASETOトークンを検査してv1.publicと確認し、次のプラットフォーム更新の一環としてv4.publicへの移行をフラグ立てします。