PASETO vs JWT — セキュリティ比較
PASETOとJWTのセキュリティを比較:アルゴリズム取り違え、alg=none、鍵タイプ取り違え、ヘッダー攻撃、移行時の考慮事項。
詳細な説明
PASETOとJWTは同じ問題(クレーム付きベアラートークン)を解きますが、PASETOの設計選択はJWT実装で繰り返し発生してきた脆弱性クラスを体系的に排除します。
「alg=none」フットガン:
JWTはトークン自身が alg ヘッダーで使用アルゴリズムを宣言できます。最も悪名高い失敗モードは {"alg": "none"} で、歴史的にはこれにより一部のライブラリが署名検証を完全にスキップしてしまいました。PASETOには alg ヘッダーが存在しません — 暗号スイートはバージョンの一部です(v4.public は常にEd25519、それ以外なし)。PASETOには alg=none の解析可能な等価物がありません。
アルゴリズム取り違え攻撃:
JWTでは攻撃者が RS256 トークンを HS256 に書き換え、不適切に書かれた検証器をだましてRSAの公開鍵をHMACの秘密鍵として使わせることがあります。JWT界の修正は鍵ごとに受け入れアルゴリズムを制限することですが、フットガンは依然として装填されたままです。PASETOはバージョン管理によりこれを排除します:v4.public 用に設定された検証器は他のものを単純に拒否します — 取り違える鍵タイプがありません。
鍵タイプ取り違え:
アルゴリズム取り違えと根本原因は同じですが、鍵層で発生します。PASETOは検証器レベルでバージョン+用途にコミットすることを要求するため、鍵APIを物理的に誤用できません。
ヘッダー改ざん:
JWTのヘッダーはJSONで、署名検証の前に解析され信頼されます。攻撃者が攻撃者制御のURLを指す jku、x5u、kid クレームを追加するCVEが存在しました。PASETOには解析可能なヘッダーがなく、固定の vN.purpose 文字列だけなので、この攻撃面全体が消えます。kid 風のヒントが必要なら、認証もされるフッターに格納します。
ISO 8601タイムスタンプ:
JWTのタイムスタンプはUnix秒(NumericDate)です。PASETOはISO 8601文字列を使います。これにより人間に読みやすくなり、秒とミリ秒を取り違える非常に一般的なバグを避けられます。
JWTがまだ勝っている点:
エコシステムと標準準拠です。OAuth 2.0、OpenID Connect、ほとんどのエンタープライズアイデンティティベンダーはJWTを話します。それらと統合するなら通常PASETOを選べません。PASETOはグリーンフィールドの内部トークン用途で輝きます。
ユースケース
セキュリティレビューが、複数アルゴリズムを受け付け取り違え攻撃のリスクがあったカスタムJWT設定を置き換える新規内部サービストークンとしてPASETO v4.publicを推奨。