5. Producing and Consuming JWSs (生成和使用 JWS)
5.1 Message Signature or MAC Computation (消息签名或 MAC 计算)
要创建 JWS, 执行以下步骤. 在输入和输出之间没有依赖关系的情况下, 步骤的顺序并不重要.
-
创建用作 JWS Payload 的内容.
-
计算编码的载荷值 BASE64URL(JWS Payload).
-
创建包含所需 Header Parameters 集合的 JSON 对象, 这些对象共同构成 JOSE Header (JWS Protected Header 和/或 JWS Unprotected Header).
-
计算编码的头部值 BASE64URL(UTF8(JWS Protected Header)). 如果 JWS Protected Header 不存在 (这只能在使用 JWS JSON Serialization 且没有 "protected" 成员存在时发生), 则让此值为空字符串.
-
以为正在使用的特定算法定义的方式, 对 JWS Signing Input ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) 计算 JWS Signature. "alg" (algorithm, 算法) Header Parameter 必须 (MUST) 存在于 JOSE Header 中, 其算法值准确表示用于构造 JWS Signature 的算法.
-
计算编码的签名值 BASE64URL(JWS Signature).
-
如果正在使用 JWS JSON Serialization, 则对正在执行的每个数字签名或 MAC 操作重复此过程 (步骤 3-6).
-
创建所需的序列化输出. 此结果的 JWS Compact Serialization 是 BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature). JWS JSON Serialization 在第 7.2 节中描述.
5.2 Message Signature or MAC Validation (消息签名或 MAC 验证)
验证 JWS 时, 执行以下步骤. 在输入和输出之间没有依赖关系的情况下, 步骤的顺序并不重要. 如果列出的任何步骤失败, 则无法验证签名或 MAC.
当存在多个 JWS Signature 值时, 由应用程序决定哪些 JWS Signature 值必须成功验证才能接受 JWS. 在某些情况下, 所有签名都必须成功验证, 否则 JWS 将被视为无效. 在其他情况下, 只需要成功验证特定的 JWS Signature 值. 但是, 在所有情况下, 至少一个 JWS Signature 值必须 (MUST) 成功验证, 否则必须 (MUST) 将 JWS 视为无效.
-
解析 JWS 表示以提取 JWS 组件的序列化值. 使用 JWS Compact Serialization 时, 这些组件是 JWS Protected Header、JWS Payload 和 JWS Signature 的 base64url 编码表示, 使用 JWS JSON Serialization 时, 这些组件还包括未编码的 JWS Unprotected Header 值. 使用 JWS Compact Serialization 时, JWS Protected Header、JWS Payload 和 JWS Signature 按该顺序表示为 base64url 编码的值, 每个值与下一个值之间用单个句点 ('.') 字符分隔, 从而恰好使用两个分隔句点字符. JWS JSON Serialization 在第 7.2 节中描述.
-
Base64url 解码 JWS Protected Header 的编码表示, 遵循不使用换行符、空白或其他附加字符的限制.
-
验证结果八位字节序列是符合 RFC 7159 [RFC7159] 的完全有效 JSON 对象的 UTF-8 编码表示; 让 JWS Protected Header 成为此 JSON 对象.
-
如果使用 JWS Compact Serialization, 则让 JOSE Header 成为 JWS Protected Header. 否则, 当使用 JWS JSON Serialization 时, 让 JOSE Header 成为相应 JWS Protected Header 和 JWS Unprotected Header 的成员的并集, 所有这些都必须是完全有效的 JSON 对象. 在此步骤中, 验证结果 JOSE Header 不包含重复的 Header Parameter 名称. 使用 JWS JSON Serialization 时, 此限制包括相同的 Header Parameter 名称也禁止 (MUST NOT) 出现在共同构成 JOSE Header 的不同 JSON 对象值中.
-
验证实现理解并可以处理它需要支持的所有字段, 无论是本规范要求的、正在使用的算法要求的, 还是 "crit" Header Parameter 值要求的, 并且这些参数的值也被理解和支持.
-
Base64url 解码 JWS Payload 的编码表示, 遵循不使用换行符、空白或其他附加字符的限制.
-
Base64url 解码 JWS Signature 的编码表示, 遵循不使用换行符、空白或其他附加字符的限制.
-
以为正在使用的算法定义的方式, 针对 JWS Signing Input ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) 验证 JWS Signature, 该算法必须 (MUST) 由 "alg" (algorithm, 算法) Header Parameter 的值准确表示, 该参数必须 (MUST) 存在. 有关算法验证的安全注意事项, 请参见第 10.6 节. 记录验证是否成功.
-
如果正在使用 JWS JSON Serialization, 则对表示中包含的每个数字签名或 MAC 值重复此过程 (步骤 4-8).
-
如果步骤 9 中的所有验证都未成功, 则必须 (MUST) 将 JWS 视为无效. 否则, 在 JWS JSON Serialization 情况下, 向应用程序返回一个结果, 指示哪些验证成功和失败. 在 JWS Compact Serialization 情况下, 结果可以简单地指示 JWS 是否成功验证.
最后, 请注意, 由应用程序决定在给定上下文中可以使用哪些算法. 即使可以成功验证 JWS, 除非 JWS 中使用的算法对应用程序可接受, 否则应该 (SHOULD) 将 JWS 视为无效.
5.3 String Comparison Rules (字符串比较规则)
处理 JWS 不可避免地需要将已知字符串与 JSON 对象中的成员和值进行比较. 例如, 在检查算法是什么时, 将针对 JOSE Header 中的成员名称检查 Unicode 字符串 "alg", 以查看是否存在匹配的 Header Parameter 名称. 然后使用相同的过程来确定 "alg" Header Parameter 的值是否表示支持的算法.
RFC 7159 [RFC7159] 第 8.3 节描述了执行成员名称比较的 JSON 规则. 由于执行的唯一字符串比较操作是相等和不相等, 因此可以使用相同的规则来比较成员名称和成员值与已知字符串.
这些比较规则必须 (MUST) 用于所有 JSON 字符串比较, 除非成员的定义明确指出该成员值要使用不同的比较规则. 只有本规范中定义的 "typ" 和 "cty" 成员值不使用这些比较规则.
某些应用程序可能在区分大小写的值中包含不区分大小写的信息, 例如将 DNS 名称作为 "kid" (key ID, 密钥 ID) 值的一部分. 在这些情况下, 如果多个方可能需要生成相同的值以便可以比较它们, 则应用程序可能需要定义用于表示不区分大小写部分的规范大小写的约定, 例如将它们小写. (但是, 如果所有其他方逐字使用生产方发出的任何值, 而不尝试将其与独立生成的值进行比较, 则生产者使用的大小写将无关紧要.)
另请参见第 10.12 节中的 JSON 安全注意事项和第 10.13 节中的 Unicode 安全注意事项.