3. JSON Web Encryption (JWE) Overview (JWE 概述)
JWE 使用 JSON 数据结构和 base64url 编码表示加密内容. 这些 JSON 数据结构可以 (MAY) 在任何 JSON 值或结构字符之前或之后包含空白和/或换行符, 符合 RFC 7159 [RFC7159] 第 2 节的规定. JWE 表示以下逻辑值 (每个值在第 2 节中定义):
- JOSE Header
- JWE Encrypted Key (JWE 加密密钥)
- JWE Initialization Vector (JWE 初始化向量)
- JWE AAD
- JWE Ciphertext (JWE 密文)
- JWE Authentication Tag (JWE 认证标签)
对于 JWE, JOSE Header 成员是以下值成员的并集 (每个值在第 2 节中定义):
- JWE Protected Header (JWE 受保护头部)
- JWE Shared Unprotected Header (JWE 共享非受保护头部)
- JWE Per-Recipient Unprotected Header (JWE 每接收方非受保护头部)
JWE 利用认证加密来确保明文的机密性和完整性, 以及 JWE Protected Header 和 JWE AAD 的完整性.
本文档为 JWE 定义了两种序列化方式: 一种称为 JWE Compact Serialization (JWE 紧凑序列化) 的紧凑、URL 安全序列化, 以及一种称为 JWE JSON Serialization (JWE JSON 序列化) 的 JSON 序列化. 在这两种序列化中, JWE Protected Header、JWE Encrypted Key、JWE Initialization Vector、JWE Ciphertext 和 JWE Authentication Tag 都经过 base64url 编码, 因为 JSON 缺乏直接表示任意八位字节序列的方法. 当存在时, JWE AAD 也经过 base64url 编码.
3.1 JWE Compact Serialization Overview (JWE 紧凑序列化概述)
在 JWE Compact Serialization 中, 不使用 JWE Shared Unprotected Header 或 JWE Per-Recipient Unprotected Header. 在这种情况下, JOSE Header 和 JWE Protected Header 是相同的.
在 JWE Compact Serialization 中, JWE 表示为以下连接:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
有关 JWE Compact Serialization 的更多信息, 请参见第 7.1 节.
3.2 JWE JSON Serialization Overview (JWE JSON 序列化概述)
在 JWE JSON Serialization 中, JWE Protected Header、JWE Shared Unprotected Header 和 JWE Per-Recipient Unprotected Header 中的一个或多个必须 (MUST) 存在. 在这种情况下, JOSE Header 的成员是存在的 JWE Protected Header、JWE Shared Unprotected Header 和 JWE Per-Recipient Unprotected Header 值的成员的并集.
在 JWE JSON Serialization 中, JWE 表示为包含以下八个成员中的部分或全部的 JSON 对象:
- "protected", 值为 BASE64URL(UTF8(JWE Protected Header))
- "unprotected", 值为 JWE Shared Unprotected Header
- "header", 值为 JWE Per-Recipient Unprotected Header
- "encrypted_key", 值为 BASE64URL(JWE Encrypted Key)
- "iv", 值为 BASE64URL(JWE Initialization Vector)
- "ciphertext", 值为 BASE64URL(JWE Ciphertext)
- "tag", 值为 BASE64URL(JWE Authentication Tag)
- "aad", 值为 BASE64URL(JWE AAD)
这六个 base64url 编码的结果字符串和两个非受保护的 JSON 对象值在 JSON 对象中表示为成员. 包含其中一些值是可选的 (OPTIONAL). JWE JSON Serialization 还可以将明文加密给多个接收方. 有关 JWE JSON Serialization 的更多信息, 请参见第 7.2 节.
3.3 Example JWE (JWE 示例)
本示例将明文 "The true sign of intelligence is not knowledge but imagination." 加密给接收方.
以下示例 JWE Protected Header 声明:
- Content Encryption Key 使用 RSAES-OAEP [RFC3447] 算法加密给接收方以产生 JWE Encrypted Key.
- 使用 AES GCM [AES] [NIST.800-38D] 算法和 256 位密钥对明文执行认证加密, 以产生密文和 Authentication Tag.
{"alg":"RSA-OAEP","enc":"A256GCM"}
将此 JWE Protected Header 编码为 BASE64URL(UTF8(JWE Protected Header)) 得到此值:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ
完成创建此 JWE 的其余步骤是:
- 生成随机的 Content Encryption Key (CEK).
- 使用 RSAES-OAEP 算法用接收方的公钥加密 CEK 以产生 JWE Encrypted Key.
- Base64url 编码 JWE Encrypted Key.
- 生成随机的 JWE Initialization Vector.
- Base64url 编码 JWE Initialization Vector.
- 让 Additional Authenticated Data 加密参数为 ASCII(BASE64URL(UTF8(JWE Protected Header))).
- 使用 AES GCM 算法对明文执行认证加密, 使用 CEK 作为加密密钥、JWE Initialization Vector 和 Additional Authenticated Data 值, 请求 128 位 Authentication Tag 输出.
- Base64url 编码密文.
- Base64url 编码 Authentication Tag.
- 组装最终表示: 此结果的 Compact Serialization 是字符串 BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag).
此示例中的最终结果 (为显示目的添加了换行符) 是:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ
有关计算此 JWE 的完整详细信息, 请参见附录 A.1. 有关其他示例, 请参见附录 A, 包括第 A.4 和 A.5 节中使用 JWE JSON Serialization 的示例.