跳到主要内容

3. JSON Web Signature (JWS) 概述

3. JSON Web Signature (JWS) 概述 (Overview)​

JWS 使用 JSON 数据结构和 base64url 编码表示经过数字签名或 MAC 处理的内容. 根据 RFC 7159 [RFC7159] 第 2 节, 这些 JSON 数据结构 MAY 在任何 JSON 值或结构字符之前或之后包含空白和/或换行. 一个 JWS 表示以下逻辑值 (每个值均在第 2 节定义):

  • JOSE Header
  • JWS Payload
  • JWS Signature

对于一个 JWS, JOSE Header 的成员是以下值的成员并集 (每个值均在第 2 节定义):

  • JWS Protected Header
  • JWS Unprotected Header

本文为 JWS 定义了两种序列化形式: 一种紧凑且 URL 安全的序列化形式, 称为 JWS Compact Serialization; 另一种 JSON 序列化形式, 称为 JWS JSON Serialization. 在这两种序列化形式中, JWS Protected Header, JWS Payload 和 JWS Signature 都经过 base64url 编码, 因为 JSON 无法直接表示任意八位字节序列.

3.1 JWS Compact Serialization 概述​

在 JWS Compact Serialization 中, 不使用 JWS Unprotected Header. 在这种情况下, JOSE Header 与 JWS Protected Header 相同.

在 JWS Compact Serialization 中, JWS 表示为以下拼接结果:

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

关于 JWS Compact Serialization 的更多信息, 见第 7.1 节.

3.2 JWS JSON Serialization 概述​

在 JWS JSON Serialization 中, JWS Protected Header 和 JWS Unprotected Header 中的一个或两个 MUST 存在. 在这种情况下, JOSE Header 的成员是实际存在的 JWS Protected Header 和 JWS Unprotected Header 值的成员并集.

在 JWS JSON Serialization 中, JWS 表示为包含以下四个成员中的部分或全部成员的 JSON 对象:

  • "protected", 值为 BASE64URL(UTF8(JWS Protected Header))
  • "header", 值为 JWS Unprotected Header
  • "payload", 值为 BASE64URL(JWS Payload)
  • "signature", 值为 BASE64URL(JWS Signature)

三个经过 base64url 编码的结果字符串和 JWS Unprotected Header 值都表示为 JSON 对象中的成员. 这些值中的某些值是否包含是 OPTIONAL. JWS JSON Serialization 还可以表示多个签名和/或 MAC 值, 而不只是一个. 关于 JWS JSON Serialization 的更多信息, 见第 7.2 节.

3.3 JWS 示例​

本节提供一个 JWS 示例. 其计算过程在附录 A.1 中有更详细的描述, 其中包括指定用于表示所用 JSON 值的确切八位字节序列以及所用密钥值.

以下示例 JWS Protected Header 声明被编码对象是 JSON Web Token [JWT], 并且 JWS Protected Header 和 JWS Payload 使用 HMAC SHA-256 [RFC2104] [SHS] 算法进行保护:

{"typ":"JWT",
"alg":"HS256"}

将此 JWS Protected Header 编码为 BASE64URL(UTF8(JWS Protected Header)) 得到以下值:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

以下 JSON 对象的 UTF-8 表示形式用作 JWS Payload. (注意, 载荷可以是任何内容, 不必是 JSON 对象的表示形式.)

{"iss":"joe",
"exp":1300819380,
"http://example.com/is_root":true}

将此 JWS Payload 编码为 BASE64URL(JWS Payload) 得到以下值 (换行仅用于显示):

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ

使用附录 A.1 中指定的密钥, 通过 HMAC SHA-256 算法计算 JWS Signing Input ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) 的 HMAC, 并对结果进行 base64url 编码, 得到以下 BASE64URL(JWS Signature) 值:

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

按 Header.Payload.Signature 的顺序拼接这些值, 并在各部分之间使用句点 ('.') 字符, 即得到以下使用 JWS Compact Serialization 的完整 JWS 表示形式 (换行仅用于显示):

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

更多示例见附录 A, 其中包括第 A.6 节和第 A.7 节中使用 JWS JSON Serialization 的示例.