Skip to main content

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

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

  • JOSE Header (JOSE 头部)
  • JWS Payload (JWS 载荷)
  • JWS Signature (JWS 签名)

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

  • JWS Protected Header (JWS 受保护头部)
  • JWS Unprotected Header (JWS 非受保护头部)

本文档为 JWS 定义了两种序列化方式: 一种称为 JWS Compact Serialization (JWS 紧凑序列化) 的紧凑、URL 安全序列化, 以及一种称为 JWS JSON Serialization (JWS JSON 序列化) 的 JSON 序列化. 在这两种序列化中, JWS Protected Header、JWS Payload 和 JWS Signature 都经过 base64url 编码, 因为 JSON 缺乏直接表示任意八位字节序列的方法.

3.1 JWS Compact Serialization Overview (JWS 紧凑序列化概述)

在 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 Overview (JWS JSON 序列化概述)

在 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 Example JWS (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 的示例.