メインコンテンツまでスキップ

RFC 7518: JSON Web Algorithms(JWA)

RFC 7518 は、JWS、JWE、JWK で使用する暗号アルゴリズムを定義した仕様です。


第1部: 概要編

JWA とは何か?

JWA(JSON Web Algorithms)は、JOSE(JSON Object Signing and Encryption)で使用できる暗号アルゴリズムのカタログです。

JOSE ファミリー:
┌─────────────────────────────────────────────┐
│ JWA │
│ (アルゴリズムの定義) │
└─────────────────────────────────────────────┘
▲ ▲ ▲
│ │ │
┌────────┴────────┐ ┌───┴───┐ ┌───────┴───────┐
│ JWS │ │ JWE │ │ JWK │
│ (署名) │ │(暗号化)│ │ (鍵表現) │
└─────────────────┘ └───────┘ └───────────────┘

アルゴリズムの分類

分類用途
署名アルゴリズムJWS の署名RS256, ES256, HS256
鍵暗号化アルゴリズムJWE の CEK 暗号化RSA-OAEP, ECDH-ES
コンテンツ暗号化アルゴリズムJWE のペイロード暗号化A256GCM
鍵管理アルゴリズム鍵のラップA256KW

第2部: 署名アルゴリズム

HMAC(対称鍵署名)

アルゴリズム説明鍵長
HS256HMAC using SHA-256256 ビット以上推奨
HS384HMAC using SHA-384384 ビット以上推奨
HS512HMAC using SHA-512512 ビット以上推奨
特徴:
✅ 高速
✅ 実装がシンプル
❌ 鍵の共有が必要(署名者と検証者が同じ鍵を持つ)
❌ 否認防止ができない

用途:
- 同一システム内での署名(例: セッショントークン)
- client_secret_jwt

RSA(非対称鍵署名)

RSASSA-PKCS1-v1_5

アルゴリズム説明推奨
RS256RSASSA-PKCS1-v1_5 using SHA-256✅ 広く使用
RS384RSASSA-PKCS1-v1_5 using SHA-384
RS512RSASSA-PKCS1-v1_5 using SHA-512
特徴:
✅ 広くサポートされている
✅ 秘密鍵で署名、公開鍵で検証
⚠️ PS256 より古い方式

鍵サイズ: 2048 ビット以上必須、4096 ビット推奨

RSASSA-PSS

アルゴリズム説明推奨
PS256RSASSA-PSS using SHA-256✅ より安全
PS384RSASSA-PSS using SHA-384
PS512RSASSA-PSS using SHA-512
特徴:
✅ PKCS#1 v1.5 より安全(確率的署名)
✅ 証明可能なセキュリティ
⚠️ 古いライブラリでサポートされていない場合がある

FAPI 2.0 では PS256 または ES256 を推奨

ECDSA(楕円曲線署名)

アルゴリズム曲線説明推奨
ES256P-256ECDSA using P-256 and SHA-256✅ 推奨
ES384P-384ECDSA using P-384 and SHA-384
ES512P-521ECDSA using P-521 and SHA-512
特徴:
✅ RSA より短い鍵で同等のセキュリティ
✅ 署名サイズが小さい
✅ 署名生成が高速
⚠️ 署名検証は RSA より遅い

比較(同等のセキュリティ):
RSA-2048 ≈ EC P-256
RSA-3072 ≈ EC P-384
RSA-15360 ≈ EC P-521

EdDSA(Edwards 曲線署名)

アルゴリズム曲線説明推奨
EdDSAEd25519Edwards-curve Digital Signature✅ 最新・推奨
EdDSAEd448Edwards-curve Digital Signature
特徴:
✅ 非常に高速
✅ 決定論的署名(同じ入力から同じ署名)
✅ サイドチャネル攻撃に強い
⚠️ 比較的新しい(RFC 8037 で追加)

none(署名なし)

アルゴリズム: none
署名: なし

⚠️ 警告:
- 本番環境では絶対に使用しない
- テスト目的のみ
- 検証側で必ず拒否する設定にする

署名アルゴリズムの選択ガイド

用途別の推奨:

┌─────────────────────────────────────────────────┐
│ 新規実装 │
│ → ES256 または EdDSA │
├─────────────────────────────────────────────────┤
│ 既存システムとの互換性 │
│ → RS256 │
├─────────────────────────────────────────────────┤
│ FAPI 2.0 準拠 │
│ → PS256 または ES256 │
├─────────────────────────────────────────────────┤
│ 同一システム内(鍵共有可能) │
│ → HS256(ただし client_secret_jwt 程度) │
└─────────────────────────────────────────────────┘

第3部: 鍵暗号化アルゴリズム

JWE で CEK(Content Encryption Key)を暗号化するアルゴリズム。

RSA 系

アルゴリズム説明推奨
RSA1_5RSAES-PKCS1-v1_5❌ 非推奨
RSA-OAEPRSAES OAEP using SHA-1⚠️
RSA-OAEP-256RSAES OAEP using SHA-256✅ 推奨
RSA1_5 を使用しない理由:
- Bleichenbacher のパディングオラクル攻撃
- RFC 8017 で新規使用は非推奨

RSA-OAEP-256 を推奨:
- SHA-256 を使用
- パディングオラクル攻撃に耐性

AES Key Wrap

アルゴリズム説明
A128KWAES Key Wrap with 128-bit key
A192KWAES Key Wrap with 192-bit key
A256KWAES Key Wrap with 256-bit key
特徴:
- 対称鍵で CEK をラップ
- 事前共有鍵が必要

AES-GCM Key Wrap

アルゴリズム説明
A128GCMKWAES GCM Key Wrap with 128-bit key
A192GCMKWAES GCM Key Wrap with 192-bit key
A256GCMKWAES GCM Key Wrap with 256-bit key
特徴:
- AEAD(認証付き暗号化)
- iv と tag が追加で必要

ECDH 系

アルゴリズム説明
ECDH-ESECDH Ephemeral Static
ECDH-ES+A128KWECDH-ES with AES-128 Key Wrap
ECDH-ES+A192KWECDH-ES with AES-192 Key Wrap
ECDH-ES+A256KWECDH-ES with AES-256 Key Wrap
ECDH-ES:
- 一時的な EC 鍵ペアを生成
- 受信者の公開鍵と ECDH で共有秘密を導出
- 共有秘密から CEK を導出

ECDH-ES+A256KW:
- 共有秘密から KEK(Key Encryption Key)を導出
- KEK で CEK をラップ

Direct

アルゴリズム説明
dirDirect use of shared symmetric key
特徴:
- 事前共有鍵を CEK として直接使用
- Encrypted Key が空になる
- 事前に鍵を共有する必要がある

パスワードベース

アルゴリズム説明
PBES2-HS256+A128KWPBES2 with HMAC SHA-256 and A128KW
PBES2-HS384+A192KWPBES2 with HMAC SHA-384 and A192KW
PBES2-HS512+A256KWPBES2 with HMAC SHA-512 and A256KW
特徴:
- パスワードから鍵を導出
- p2s(salt)と p2c(iteration count)が必要
- ユーザー向け暗号化に使用

第4部: コンテンツ暗号化アルゴリズム

JWE でペイロードを暗号化するアルゴリズム。

AES-CBC + HMAC

アルゴリズム説明鍵長
A128CBC-HS256AES-128-CBC + HMAC-SHA-256256 ビット
A192CBC-HS384AES-192-CBC + HMAC-SHA-384384 ビット
A256CBC-HS512AES-256-CBC + HMAC-SHA-512512 ビット
構成:
- AES-CBC で暗号化
- HMAC で認証タグを生成
- Encrypt-then-MAC 方式

鍵の分割:
CEK の前半 → MAC 鍵
CEK の後半 → 暗号化鍵

AES-GCM(推奨)

アルゴリズム説明鍵長
A128GCMAES-128-GCM128 ビット
A192GCMAES-192-GCM192 ビット
A256GCMAES-256-GCM256 ビット
特徴:
✅ AEAD(暗号化と認証を同時に)
✅ 高速(ハードウェアアクセラレーション)
✅ IV は 96 ビット
⚠️ IV の再利用は厳禁

第5部: アルゴリズムの選択

署名アルゴリズム

シナリオ推奨
一般的な用途ES256
最新のセキュリティEdDSA (Ed25519)
既存互換性重視RS256
FAPI 準拠PS256 または ES256
高速性重視HS256(鍵共有可能な場合のみ)

暗号化アルゴリズム

シナリオalgenc
一般的な用途RSA-OAEP-256A256GCM
EC ベースECDH-ES+A256KWA256GCM
パスワード暗号化PBES2-HS512+A256KWA256GCM
事前共有鍵dirA256GCM

非推奨・禁止

アルゴリズム理由
none署名なし。本番禁止
RSA1_5パディングオラクル攻撃
HS256 + 短い鍵ブルートフォース可能

参考リンク