4. JOSE Header (JOSE 头部)
对于 JWE, 表示 JOSE Header 的 JSON 对象的成员描述了应用于明文的加密以及可选的 JWE 的其他属性. JOSE Header 中的 Header Parameter 名称必须 (MUST) 是唯一的, 正如 [JWS] 第 4 节中所述. 关于处理实现不理解的 Header Parameters 的规则也是相同的. Header Parameter 名称的类别同样相同.
4.1 Registered Header Parameter Names (注册头部参数名称)
以下用于 JWE 的 Header Parameter 名称在 [JWS] 建立的 IANA "JSON Web Signature and Encryption Header Parameters" 注册表中注册, 其含义如下定义.
如通用注册表所示, JWS 和 JWE 共享一个通用的 Header Parameter 空间; 当参数被两个规范使用时, 其用法在规范之间必须兼容.
4.1.1 "alg" (Algorithm) Header Parameter (算法头部参数)
此参数的含义、语法和处理规则与 [JWS] 第 4.1.1 节中定义的 "alg" Header Parameter 相同, 不同之处在于 Header Parameter 标识用于加密或确定 CEK 值的加密算法. 如果 "alg" 值不表示支持的算法, 或者接收方没有可与该算法一起使用的密钥, 则加密内容不可用.
[JWA] 建立的 IANA "JSON Web Signature and Encryption Algorithms" 注册表中可以找到用于此用途的已定义 "alg" 值列表; 此注册表的初始内容是 [JWA] 第 4.1 节中定义的值.
4.1.2 "enc" (Encryption Algorithm) Header Parameter (加密算法头部参数)
"enc" (encryption algorithm, 加密算法) Header Parameter 标识用于对明文执行认证加密以产生密文和 Authentication Tag 的内容加密算法. 此算法必须 (MUST) 是具有指定密钥长度的 AEAD 算法. 如果 "enc" 值不表示支持的算法, 则加密内容不可用. "enc" 值应该在 [JWA] 建立的 IANA "JSON Web Signature and Encryption Algorithms" 注册表中注册, 或者是包含 Collision-Resistant Name 的值. "enc" 值是包含 StringOrURI 值的区分大小写的 ASCII 字符串. 此 Header Parameter 必须 (MUST) 存在, 并且必须 (MUST) 被实现理解和处理.
[JWA] 建立的 IANA "JSON Web Signature and Encryption Algorithms" 注册表中可以找到用于此用途的已定义 "enc" 值列表; 此注册表的初始内容是 [JWA] 第 5.1 节中定义的值.
4.1.3 "zip" (Compression Algorithm) Header Parameter (压缩算法头部参数)
"zip" (compression algorithm, 压缩算法) 应用于加密前的明文 (如果有). 本规范定义的 "zip" 值是:
- "DEF" - 使用 DEFLATE [RFC1951] 算法压缩
可以使用其他值 (MAY). 压缩算法值可以在 [JWA] 建立的 IANA "JSON Web Encryption Compression Algorithms" 注册表中注册. "zip" 值是区分大小写的字符串. 如果不存在 "zip" 参数, 则在加密前不对明文应用压缩. 使用时, 此 Header Parameter 必须 (MUST) 受完整性保护; 因此, 它必须 (MUST) 仅出现在 JWE Protected Header 中. 使用此 Header Parameter 是可选的 (OPTIONAL). 此 Header Parameter 必须 (MUST) 被实现理解和处理.
4.1.4 "jku" (JWK Set URL) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.2 节中定义的 "jku" Header Parameter 相同, 不同之处在于 JWK Set 资源包含 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥.
4.1.5 "jwk" (JSON Web Key) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.3 节中定义的 "jwk" Header Parameter 相同, 不同之处在于密钥是 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥.
4.1.6 "kid" (Key ID) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.4 节中定义的 "kid" Header Parameter 相同, 不同之处在于密钥提示引用 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥. 此参数允许发起者明确向 JWE 接收方发出密钥更改的信号.
4.1.7 "x5u" (X.509 URL) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.5 节中定义的 "x5u" Header Parameter 相同, 不同之处在于 X.509 公钥证书或证书链 [RFC5280] 包含 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥.
4.1.8 "x5c" (X.509 Certificate Chain) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.6 节中定义的 "x5c" Header Parameter 相同, 不同之处在于 X.509 公钥证书或证书链 [RFC5280] 包含 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥.
有关 "x5c" 值的示例, 请参见 [JWS] 的附录 B.
4.1.9 "x5t" (X.509 Certificate SHA-1 Thumbprint) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.7 节中定义的 "x5t" Header Parameter 相同, 不同之处在于指纹引用的证书包含 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥. 请注意, 证书指纹有时也称为证书指纹.
4.1.10 "x5t#S256" (X.509 Certificate SHA-256 Thumbprint) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.8 节中定义的 "x5t#S256" Header Parameter 相同, 不同之处在于指纹引用的证书包含 JWE 加密到的公钥; 这可用于确定解密 JWE 所需的私钥. 请注意, 证书指纹有时也称为证书指纹.
4.1.11 "typ" (Type) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.9 节中定义的 "typ" Header Parameter 相同, 不同之处在于类型是此完整 JWE 的类型.
4.1.12 "cty" (Content Type) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.10 节中定义的 "cty" Header Parameter 相同, 不同之处在于类型是受保护内容 (明文) 的类型.
4.1.13 "crit" (Critical) Header Parameter
此参数的含义、语法和处理规则与 [JWS] 第 4.1.11 节中定义的 "crit" Header Parameter 相同, 不同之处在于引用的是 JWE 的 Header Parameters, 而不是 JWS 的 Header Parameters.
4.2 Public Header Parameter Names (公共头部参数名称)
使用 JWE 的人可以定义其他 Header Parameter 名称. 但是, 为了防止冲突, 任何新的 Header Parameter 名称应该在 [JWS] 建立的 IANA "JSON Web Signature and Encryption Header Parameters" 注册表中注册, 或者是 Public Name: 包含 Collision-Resistant Name 的值. 在每种情况下, 名称或值的定义者都需要采取合理的预防措施, 以确保他们控制用于定义 Header Parameter 名称的命名空间部分.
应该谨慎引入新的 Header Parameters, 因为它们可能导致不可互操作的 JWE.
4.3 Private Header Parameter Names (私有头部参数名称)
JWE 的生产者和消费者可以同意使用 Private Names (不是 Registered Header Parameter names (第 4.1 节) 或 Public Header Parameter names (第 4.2 节) 的名称) 的 Header Parameter 名称. 与 Public Header Parameter Names 不同, Private Header Parameter Names 可能会发生冲突, 应该谨慎使用.