跳到主要内容

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 的示例.