跳到主要内容

7. 序列化

7. 序列化 (Serializations)

JWS 使用两种序列化 (Serialization) 之一: JWS Compact Serialization 或 JWS JSON Serialization. 使用本规范的应用需要说明该应用使用哪种序列化及哪些序列化特性. 例如, 应用可以规定仅使用 JWS JSON Serialization, 仅使用 JWS JSON Serialization 中对单个签名或 MAC 值的支持, 或者使用对多个签名和/或 MAC 值的支持. JWS 实现只需要实现其所设计支持的应用所需的特性.

7.1 JWS Compact Serialization

JWS Compact Serialization 将经过数字签名或 MAC 处理的内容表示为一个紧凑且 URL 安全的字符串. 该字符串为:

BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS Payload) || '.' ||
BASE64URL(JWS Signature)

JWS Compact Serialization 仅支持一个签名/MAC, 并且不提供用于表示 JWS Unprotected Header 值的语法.

7.2 JWS JSON Serialization

JWS JSON Serialization 将经过数字签名或 MAC 处理的内容表示为一个 JSON 对象. 这种表示形式既未针对紧凑性优化, 也不是 URL 安全的.

JWS JSON Serialization 定义了两种密切相关的语法: 一种是完全通用语法 (general syntax), 可用多个数字签名和/或 MAC 操作来保护内容; 另一种是扁平化语法 (flattened syntax), 针对单个数字签名或 MAC 的情形进行了优化.

7.2.1 通用 JWS JSON Serialization 语法

以下成员定义用于完全通用 JWS JSON Serialization 语法中的顶层 JSON 对象:

payload : "payload" 成员 MUST 存在, 并且包含值 BASE64URL(JWS Payload).

signatures : "signatures" 成员值 MUST 是 JSON 对象数组. 每个对象表示对 JWS Payload 和 JWS Protected Header 的一个签名或 MAC.

以下成员定义用于作为 "signatures" 数组元素的 JSON 对象:

protected : 当 JWS Protected Header 值非空时, "protected" 成员 MUST 存在, 并且包含值 BASE64URL(UTF8(JWS Protected Header)); 否则, 它 MUST 不存在. 这些 Header Parameter 值受到完整性保护.

header : 当 JWS Unprotected Header 值非空时, "header" 成员 MUST 存在, 并且包含值 JWS Unprotected Header; 否则, 它 MUST 不存在. 该值表示为未编码的 JSON 对象, 而不是字符串. 这些 Header Parameter 值不受完整性保护.

signature : "signature" 成员 MUST 存在, 并且包含值 BASE64URL(JWS Signature).

对于每个签名/MAC 计算, "protected" 和 "header" 成员中至少一个 MUST 存在, 以便传递 "alg" Header Parameter 值.

上述定义的两类 JSON 对象中都可以存在其他成员; 遇到这些成员的实现如果不能理解它们, MUST 忽略它们.

创建或验证单个签名或 MAC 值时使用的 Header Parameter 值, 是可能存在的两组 Header Parameter 值的并集: (1) 签名/MAC 数组元素的 "protected" 成员所表示的 JWS Protected Header, 以及 (2) 签名/MAC 数组元素的 "header" 成员中的 JWS Unprotected Header. 这些 Header Parameter 集合的并集构成 JOSE Header. 这两个位置中的 Header Parameter 名称 MUST 互不相交.

每个 JWS Signature 值都使用对应 JOSE Header 值中的参数计算, 其方式与 JWS Compact Serialization 相同. 这带来一个有益属性: 只要该签名/MAC 计算的 JWS Protected Header 值 (表示受完整性保护的 Header Parameter 值) 与 JWS Compact Serialization 中使用的值一致, "signatures" 数组中表示的每个 JWS Signature 值, 都与在 JWS Compact Serialization 中对相同参数计算出的值相同.

概括而言, 使用通用 JWS JSON Serialization 的 JWS 语法如下:

{
"payload":"<payload contents>",
"signatures":[
{"protected":"<integrity-protected header 1 contents>",
"header":<non-integrity-protected header 1 contents>,
"signature":"<signature 1 contents>"},
...
{"protected":"<integrity-protected header N contents>",
"header":<non-integrity-protected header N contents>,
"signature":"<signature N contents>"}]
}

使用通用 JWS JSON Serialization 语法的 JWS 示例见 Appendix A.6.

7.2.2 扁平化 JWS JSON Serialization 语法

扁平化 JWS JSON Serialization 语法基于通用语法, 但将其扁平化, 以针对单个数字签名/MAC 的情形进行优化. 它通过移除 "signatures" 成员来实现扁平化, 并将原本定义用于 "signatures" 数组的那些成员 ("protected", "header", 和 "signature" 成员) 放入顶层 JSON 对象中 (与 "payload" 成员处于同一层级).

使用此语法时, "signatures" 成员 MUST NOT 存在. 除了这一语法差异外, 使用扁平化语法的 JWS JSON Serialization 对象与使用通用语法的对象按相同方式处理.

概括而言, 使用扁平化 JWS JSON Serialization 的 JWS 语法如下:

{
"payload":"<payload contents>",
"protected":"<integrity-protected header contents>",
"header":<non-integrity-protected header contents>,
"signature":"<signature contents>"
}

使用扁平化 JWS JSON Serialization 语法的 JWS 示例见 Appendix A.7.