RFC 7516: JSON Web Encryption(JWE)
RFC 7516 は、JSON ベースのデータを暗号化するための仕様です。ペイロードの機密性を保護する必要がある場合に使用します。
第1部: 概要編
JWE とは何か?
JWE(JSON Web Encryption)は、任意のデータを暗号化するための標準フォーマットです。JWS が「改ざん防止」なら、JWE は「盗聴防止」です。
JWS vs JWE:
JWS(署名):
ペイロードは見える(Base64URL)
改ざんを検知できる
JWE(暗号化):
ペイロードは見えない(暗号化済み)
機密性を保護できる
いつ JWE を使うか?
| ユースケース | 説明 |
|---|---|
| 機密情報の送信 | PII、医療情報、金融データ |
| Request Object | OIDC の暗号化リクエストオブジェクト |
| ID Token の暗号化 | クライアントのみが復号可能 |
| Nested JWT | 署名後に暗号化(Sign-then-Encrypt) |
JWE の構造
JWE Compact Serialization は 5 つのパートで構成されます。
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ
└────────┬────────┘.└───────── ─────────┬───────────────────┘.└────┬────┘.└────────────────────┬────────────────────┘.└────────┬────────┘
Header Encrypted Key IV Ciphertext Tag
| パート | 説明 |
|---|---|
| Header | アルゴリズム情報(JOSE Header) |
| Encrypted Key | コンテンツ暗号化鍵(CEK)の暗号化版 |
| IV | 初期化ベクトル |
| Ciphertext | 暗号化されたペイロード |
| Authentication Tag | 認証タグ(完全性保証) |
第2部: 詳細編
暗号化の仕組み
JWE は 2 段階の暗号化を使用します。
1. コンテンツ暗号化(CEK でペイロードを暗号化)
┌─────────────┐ ┌─────────────┐
│ Plaintext │ ──► │ Ciphertext │
└─────────────┘ └─────────────┘
│ ▲
│ │
└── CEK (Content Encryption Key)
2. 鍵暗号化(受信者の公開鍵で CEK を暗号化)
┌─────────────┐ ┌─────────────────┐
│ CEK │ ──► │ Encrypted CEK │
└─────────────┘ └─────────────────┘
│ ▲
│ │
└── 受信者の公開鍵
この方式を「ハイブリッド暗号化」と呼びます。
JOSE Header
{
"alg": "RSA-OAEP",
"enc": "A256GCM",
"kid": "key-2024-01"
}
| パラメータ | 必須 | 説明 |
|---|---|---|
alg | ✅ | 鍵暗号化アルゴリズム |
enc | ✅ | コンテンツ暗号化アルゴリズム |
zip | △ | 圧縮アルゴリズム(DEF = DEFLATE) |
kid | △ | 鍵 ID |
jku | △ | JWK Set URL |
jwk | △ | 公開鍵 |
typ | △ | メディアタイプ |
cty | △ | コンテンツタイプ |
鍵暗号化アルゴリズム(alg)
RSA 系
| アルゴリズム | 説明 | 推奨 |
|---|---|---|
RSA1_5 | RSAES-PKCS1-v1_5 | ❌ 非推奨(パディング攻撃) |
RSA-OAEP | RSAES OAEP using SHA-1 | ⚠️ |
RSA-OAEP-256 | RSAES OAEP using SHA-256 | ✅ 推奨 |
AES Key Wrap 系
| アルゴリズム | 説明 |
|---|---|
A128KW | AES Key Wrap with 128-bit key |
A192KW | AES Key Wrap with 192-bit key |
A256KW | AES Key Wrap with 256-bit key |
AES-GCM Key Wrap 系
| アルゴリズム | 説明 |
|---|---|
A128GCMKW | AES GCM Key Wrap with 128-bit key |
A192GCMKW | AES GCM Key Wrap with 192-bit key |
A256GCMKW | AES GCM Key Wrap with 256-bit key |
直接暗号化
| アルゴリズム | 説明 |
|---|---|
dir | Direct use of shared symmetric key |
CEK を暗号化せず、共有鍵を直接使用。
ECDH 系
| アルゴリズム | 説明 |
|---|---|
ECDH-ES | ECDH Ephemeral Static |
ECDH-ES+A128KW | ECDH-ES with AES-128 Key Wrap |
ECDH-ES+A192KW | ECDH-ES with AES-192 Key Wrap |
ECDH-ES+A256KW | ECDH-ES with AES-256 Key Wrap |