9. Distinguishing between JWS and JWE Objects (区分 JWS 和 JWE 对象)
有几种方法可以区分对象是 JWS 还是 JWE. 所有这些方法对于所有合法输入值都会产生相同的结果; 对于格式错误的输入, 它们可能会产生不同的结果.
-
紧凑序列化 - 段数: 如果对象使用 JWS Compact Serialization 或 JWE Compact Serialization, 则由句点 ('.') 字符分隔的 base64url 编码段的数量对于 JWS 和 JWE 是不同的. JWS 有三个段, 由两个句点 ('.') 字符分隔. JWE 有五个段, 由四个句点 ('.') 字符分隔.
-
JSON 序列化 - 成员: 如果对象使用 JWS JSON Serialization 或 JWE JSON Serialization, 则使用的成员将不同. JWS 有 "payload" 成员, 而 JWE 没有. JWE 有 "ciphertext" 成员, 而 JWS 没有.
-
alg 参数值: 可以通过检查 "alg" (algorithm, 算法) Header Parameter 值来区分 JWS 的 JOSE Header 和 JWE 的 JOSE Header. 如果该值表示数字签名或 MAC 算法, 或者是值 "none", 则它用于 JWS; 如果它表示 Key Encryption (密钥加密)、Key Wrapping (密钥包装)、Direct Key Agreement (直接密钥协商)、Key Agreement with Key Wrapping (带密钥包装的密钥协商) 或 Direct Encryption (直接加密) 算法, 则它用于 JWE. (当使用 JWS Compact Serialization 或 JWE Compact Serialization 时, 提取 "alg" 值以进行检查很简单, 当使用 JWS JSON Serialization 或 JWE JSON Serialization 时可能更困难.)
-
enc 成员存在性: 还可以通过确定是否存在 "enc" (encryption algorithm, 加密算法) 成员来区分 JWS 的 JOSE Header 和 JWE 的 JOSE Header. 如果存在 "enc" 成员, 则它是 JWE; 否则, 它是 JWS.