[RFC 主页] [文本|PDF|HTML] [跟踪器] [IPR] [勘误] [信息页面]
提议
标准
更新者:9864
存在勘误
互联网工程任务组(IETF) M. Jones
征求意见稿:7518 Microsoft
类别:标准轨道 2015 年 5 月
ISSN: 2070-1721
JSON Web 算法(JWA)
摘要
本规范注册与 JSON Web 签名(JWS)、JSON Web 加密
(JWE)和 JSON Web 密钥(JWK)规范配合使用的密码算法和标识符。
本规范还为这些标识符定义了若干 IANA 注册表。
本备忘录的状态
本文档是一份互联网标准轨道文档。
本文档是互联网工程任务组
(IETF)的成果。它代表 IETF 社区的共识。本文档已经
过公开评审,并已获互联网工程指导组(IESG)批准发布。有关
互联网标准的更多信息,请参阅 RFC 5741 的第 2 节。
有关本文档的当前状态、任何勘误以及
如何提供反馈的信息,可从以下地址获取:
http://www.rfc-editor.org/info/rfc7518.
Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Jones 标准轨道 [第 1 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
目录
1. 引言 . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1. 表示法约定 . . . . . . . . . . . . . . . . . . . 4
2. 术语 . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. 用于数字签名和 MAC 的密码算法 . . . . . . . . . . . . 6
3.1. JWS 的 "alg"(算法)头部参数值 . . . . . . . . . . 6
3.2. 使用 SHA-2 函数的 HMAC . . . . . . . . . . . . . . 7
3.3. 使用 RSASSA-PKCS1-v1_5 的数字签名 . . . . . . . 8
3.4. 使用 ECDSA 的数字签名 . . . . . . . . . . . . . . 9
3.5. 使用 RSASSA-PSS 的数字签名 . . . . . . . . . . . . 10
3.6. 使用算法 "none" . . . . . . . . . . . . . . . . . 11
4. 用于密钥管理的密码算法 . . . . . . . . . . . . . . . . 11
4.1. JWE 的 "alg"(算法)头部参数值 . . . . . . . . . . 12
4.2. 使用 RSAES-PKCS1-v1_5 的密钥加密 . . . . . . . . 13
4.3. 使用 RSAES OAEP 的密钥加密 . . . . . . . . . . . 14
4.4. 使用 AES Key Wrap 的密钥包装 . . . . . . . . . . 14
4.5. 使用共享对称密钥的直接加密 . . . . . . . . . . . 15
4.6. 使用椭圆曲线 Diffie-Hellman
临时-静态(ECDH-ES)进行密钥协商 . . . . . . . . . . . . 15
4.6.1. 用于 ECDH 密钥协商的头部参数 . . . . . . . . . 16
4.6.1.1. "epk"(临时公钥)头部参数 . . . . . . . . 16
4.6.1.2. "apu"(协商 PartyUInfo)头部参数 . . . . 17
4.6.1.3. "apv"(协商 PartyVInfo)头部参数 . . . . 17
4.6.2. ECDH 密钥协商的密钥派生 . . . . . . . . . . . 17
4.7. 使用 AES GCM 的密钥加密 . . . . . . . . . . . . . 18
4.7.1. 用于 AES GCM 密钥加密的头部参数 . . . . . . . 19
4.7.1.1. "iv"(初始化向量)头部参数 . . . . . . . 19
4.7.1.2. "tag"(认证标签)头部参数 . . . . . . . . 19
4.8. 使用 PBES2 的密钥加密 . . . . . . . . . . . . . . 20
4.8.1. 用于 PBES2 密钥加密的头部参数 . . . . . . . . 20
4.8.1.1. "p2s"(PBES2 盐输入)头部参数 . . . . . 21
4.8.1.2. "p2c"(PBES2 计数)头部参数 . . . . . . 21
5. 用于内容加密的密码算法 . . . . . . . . . . . . . . . 21
5.1. JWE 的 "enc"(加密算法)头部参数值
. . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.2. AES_CBC_HMAC_SHA2 算法 . . . . . . . . . . . . . 22
5.2.1. 定义 AES_CBC_HMAC_SHA2 时使用的约定 . . . . . 23
5.2.2. 通用 AES_CBC_HMAC_SHA2 算法 . . . . . . . . . 23
5.2.2.1. AES_CBC_HMAC_SHA2 加密 . . . . . . . . . 23
5.2.2.2. AES_CBC_HMAC_SHA2 解密 . . . . . . . . . 25
5.2.3. AES_128_CBC_HMAC_SHA_256 . . . . . . . . . . 25
5.2.4. AES_192_CBC_HMAC_SHA_384 . . . . . . . . . . 26
5.2.5. AES_256_CBC_HMAC_SHA_512 . . . . . . . . . . 26
5.2.6. 使用 AES_CBC_HMAC_SHA2 的内容加密 . . . . . . 26
5.3. 使用 AES GCM 的内容加密 . . . . . . . . . . . . . 27
6. 用于密钥的密码算法 . . . . . . . . . . . . . . . . . 27
6.1. "kty"(密钥类型)参数值 . . . . . . . . . . . . . 28
Jones 标准轨道 [第 2 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
6.2. 椭圆曲线密钥的参数 . . . . . . . . . . . . . . . 28
6.2.1. 椭圆曲线公钥的参数 . . . . . . . . . . . . . 28
6.2.1.1. "crv"(曲线)参数 . . . . . . . . . . . . 28
6.2.1.2. "x"(X 坐标)参数 . . . . . . . . . . . 29
6.2.1.3. "y"(Y 坐标)参数 . . . . . . . . . . . 29
6.2.2. 椭圆曲线私钥的参数 . . . . . . . . . . . . . 29
6.2.2.1. "d"(ECC 私钥)参数 . . . . . . . . . . . 29
6.3. RSA 密钥的参数 . . . . . . . . . . . . . . . . . 30
6.3.1. RSA 公钥的参数 . . . . . . . . . . . . . . . 30
6.3.1.1. "n"(模数)参数 . . . . . . . . . . . . . 30
6.3.1.2. "e"(指数)参数 . . . . . . . . . . . . 30
6.3.2. RSA 私钥的参数 . . . . . . . . . . . . . . . 30
6.3.2.1. "d"(私有指数)参数 . . . . . . . . . . 30
6.3.2.2. "p"(第一素因子)参数 . . . . . . . . . 31
6.3.2.3. "q"(第二素因子)参数 . . . . . . . . . 31
6.3.2.4. "dp"(第一因子 CRT 指数)参数 . . . . 31
6.3.2.5. "dq"(第二因子 CRT 指数)参数 . . . . 31
6.3.2.6. "qi"(第一 CRT 系数)参数 . . . . . . 31
6.3.2.7. "oth"(其他素数信息)参数 . . . . . . . 31
6.4. 对称密钥的参数 . . . . . . . . . . . . . . . . . 32
6.4.1. "k"(密钥值)参数 . . . . . . . . . . . . . . 32
7. IANA 注意事项 . . . . . . . . . . . . . . . . . . . . 32
7.1. JSON Web 签名和加密算法注册表 . . . . . . . . . 33
7.1.1. 注册模板 . . . . . . . . . . . . . . . . . . . 34
7.1.2. 初始注册表内容 . . . . . . . . . . . . . . . 35
7.2. 头部参数名称注册 . . . . . . . . . . . . . . . . 42
7.2.1. 注册表内容 . . . . . . . . . . . . . . . . . . 42
7.3. JSON Web 加密压缩算法注册表 . . . . . . . . . . 43
7.3.1. 注册模板 . . . . . . . . . . . . . . . . . . . 43
7.3.2. 初始注册表内容 . . . . . . . . . . . . . . . 44
7.4. JSON Web 密钥类型注册表 . . . . . . . . . . . . 44
7.4.1. 注册模板 . . . . . . . . . . . . . . . . . . . 44
7.4.2. 初始注册表内容 . . . . . . . . . . . . . . . 45
7.5. JSON Web 密钥参数注册 . . . . . . . . . . . . . 45
7.5.1. 注册表内容 . . . . . . . . . . . . . . . . . . 46
7.6. JSON Web 密钥椭圆曲线注册表 . . . . . . . . . . 48
7.6.1. 注册模板 . . . . . . . . . . . . . . . . . . . 48
7.6.2. 初始注册表内容 . . . . . . . . . . . . . . . 49
8. 安全注意事项 . . . . . . . . . . . . . . . . . . . . 49
8.1. 密码敏捷性 . . . . . . . . . . . . . . . . . . . 50
8.2. 密钥生命周期 . . . . . . . . . . . . . . . . . . 50
8.3. RSAES-PKCS1-v1_5 安全注意事项 . . . . . . . . . 50
8.4. AES GCM 安全注意事项 . . . . . . . . . . . . . . 50
8.5. 不安全 JWS 的安全注意事项 . . . . . . . . . . . 51
8.6. 拒绝服务攻击 . . . . . . . . . . . . . . . . . . 51
8.7. 加密密钥时重用密钥材料 . . . . . . . . . . . . . 51
8.8. 密码注意事项 . . . . . . . . . . . . . . . . . . 52
8.9. 密钥熵和随机值 . . . . . . . . . . . . . . . . . 52
Jones 标准轨道 [第 3 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
8.10. 数字签名与 MAC 之间的差异 . . . . . . . . . . . 52
8.11. 使用匹配的算法强度 . . . . . . . . . . . . . . 53
8.12. 自适应选择密文攻击 . . . . . . . . . . . . . . 53
8.13. 时序攻击 . . . . . . . . . . . . . . . . . . . . 53
8.14. RSA 私钥表示和盲化 . . . . . . . . . . . . . . 53
9. 国际化注意事项 . . . . . . . . . . . . . . . . . . 53
10. 参考文献 . . . . . . . . . . . . . . . . . . . . . 53
10.1. 规范性参考文献 . . . . . . . . . . . . . . . . 53
10.2. 资料性参考文献 . . . . . . . . . . . . . . . . 56
附录 A. 算法标识符交叉引用 . . . . . . . . . . . . . . 59
A.1. 数字签名/MAC 算法标识符交叉
引用 . . . . . . . . . . . . . . . . . . . . . . . . 60
A.2. 密钥管理算法标识符交叉引用 . . . . . . . . . . 61
A.3. 内容加密算法标识符交叉引用 . . . . . . . . . . . . . 62
附录 B. AES_CBC_HMAC_SHA2 算法的测试用例 . . . . . . 62
B.1. AES_128_CBC_HMAC_SHA_256 的测试用例 . . . . . . 63
B.2. AES_192_CBC_HMAC_SHA_384 的测试用例 . . . . . . 64
B.3. AES_256_CBC_HMAC_SHA_512 的测试用例 . . . . . . 65
附录 C. ECDH-ES 密钥协商计算示例 . . . . . . . . . . 66
致谢 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
作者地址 . . . . . . . . . . . . . . . . . . . . . . . . . . 69
1. 引言
本规范注册与 JSON Web 签名(JWS)[JWS]、JSON Web
加密(JWE)[JWE] 和 JSON Web 密钥(JWK)[JWK] 规范一起使用的密码算法和标识符。
它为这些标识符定义了若干 IANA 注册表。所有这些
规范都使用基于 JSON 的 [RFC7159] 数据结构。本
规范还描述了这些算法和密钥类型所特有的语义和操作。
将算法和标识符注册在这里,而不是注册在
JWS、JWE 和 JWK 规范中,旨在使这些规范在所要求、推荐、
可选和弃用算法的集合随时间变化时仍能保持不变。这也允许
对 JWS、JWE 和 JWK 规范进行更改,而无需更改本
文档。
本规范定义的名称很短,因为一个核心目标是
使生成的表示形式保持紧凑。
1.1. 表示法约定
本文档中的关键词“必须”、“不得”、“要求”、“应当”、“不得”、
“应该”、“不应该”、“推荐”、“不推荐”、“可以”和
“可选”应按照
“用于 RFC 中表示要求级别的关键词”[RFC2119] 中的描述进行解释。
Jones 标准轨道 [第 4 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
只有当这些术语全部以大写字母出现时,
才应采用上述解释。
BASE64URL(OCTETS) 表示按照
[JWS] 第 2 节对 OCTETS 进行的 base64url 编码。
UTF8(STRING) 表示 STRING 的 UTF-8 [RFC3629] 表示形式
的八位字节,其中 STRING 是由零个或多个 Unicode
[UNICODE] 字符组成的序列。
ASCII(STRING) 表示 STRING 的 ASCII [RFC20] 表示形式
的八位字节,其中 STRING 是由零个或多个 ASCII
字符组成的序列。
两个值 A 和 B 的串联表示为 A || B。
2. 术语
术语“JSON Web 签名(JWS)”、“Base64url 编码”、“头部
参数”、“JOSE 头部”、“JWS 载荷”、“JWS 受保护头部”、
“JWS 签名”、“JWS 签名输入”和“不安全 JWS”由
JWS 规范 [JWS] 定义。
术语“JSON Web 加密(JWE)”、“附加认证数据
(AAD)”、“认证标签”、“内容加密密钥(CEK)”、“直接
加密”、“直接密钥协商”、“JWE 认证标签”、“JWE
密文”、“JWE 加密密钥”、“JWE 初始化向量”、“JWE
受保护头部”、“带密钥包装的密钥协商”、“密钥
加密”、“密钥管理模式”和“密钥包装”由
JWE 规范 [JWE] 定义。
术语“JSON Web 密钥(JWK)”和“JWK 集”由 JWK
规范 [JWK] 定义。
术语“密文”、“数字签名”、“初始化向量”、
“消息认证码(MAC)”和“明文”由
“互联网安全术语表,第 2 版”[RFC4949] 定义。
本规范定义以下术语:
Base64urlUInt
将正整数或零值表示为该值无符号大端
表示形式的八位字节序列的 base64url 编码。该八位字节序列必须
使用表示该值所需的最少八位字节数。
零表示为 BASE64URL(单个值为零的
八位字节),即 "AA"。
Jones 标准轨道 [第 5 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
3. 用于数字签名和 MAC 的密码算法
JWS 使用密码算法对 JWS 受保护头部和 JWS 载荷的内容进行
数字签名或创建 MAC。
3.1. JWS 的 "alg"(算法)头部参数值
下表列出了本规范定义的供 JWS 使用的
"alg"(算法)头部参数值集合,其中每个值
都将在后续各节中更详细地说明:
+--------------+-------------------------------+--------------------+
| "alg" 参数 | 数字签名或 MAC | 实现 |
| 值 | 算法 | 要求 |
+--------------+-------------------------------+--------------------+
| HS256 | 使用 SHA-256 的 HMAC | 必需 |
| HS384 | 使用 SHA-384 的 HMAC | 可选 |
| HS512 | 使用 SHA-512 的 HMAC | 可选 |
| RS256 | 使用 SHA-256 的 | 推荐 |
| | RSASSA-PKCS1-v1_5 | |
| RS384 | 使用 SHA-384 的 | 可选 |
| | RSASSA-PKCS1-v1_5 | |
| RS512 | 使用 SHA-512 的 | 可选 |
| | RSASSA-PKCS1-v1_5 | |
| ES256 | 使用 P-256 和 SHA-256 的 ECDSA | 推荐+ |
| ES384 | 使用 P-384 和 SHA-384 的 ECDSA | 可选 |
| ES512 | 使用 P-521 和 SHA-512 的 ECDSA | 可选 |
| PS256 | 使用 SHA-256 和 | 可选 |
| | SHA-256 的 MGF1 的 RSASSA-PSS | |
| PS384 | 使用 SHA-384 和 | 可选 |
| | SHA-384 的 MGF1 的 RSASSA-PSS | |
| PS512 | 使用 SHA-512 和 | 可选 |
| | SHA-512 的 MGF1 的 RSASSA-PSS | |
| none | 不执行数字签名或 MAC | 可选 |
| | | |
+--------------+-------------------------------+--------------------+
实现要求列中的“+”表示
该要求的强度很可能会在规范的未来
版本中提高。
有关将本规范中定义的 JWS 数字
签名和 MAC "alg"(算法)值与其他标准
和软件包使用的等效标识符进行交叉引用的表,请参阅 附录 A.1。
Jones 标准轨道 [第 6 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
3.2. 使用 SHA-2 函数的 HMAC
基于散列的消息认证码(HMAC)允许使用
一个秘密值加上密码散列函数来生成 MAC。这
可用于证明生成 MAC 的一方持有
MAC 密钥。实现和
验证 HMAC 的算法在 RFC 2104 [RFC2104] 中给出。
此算法必须使用与散列输出大小相同(例如,
对于 "HS256" 为 256 位)或更大的密钥。(此
要求基于 NIST SP 800-117 [NIST.800-107] 的 第 5.3.4 节(HMAC
密钥的安全影响),其中指出
有效安全强度是密钥安全强度
与内部散列值大小两倍中的较小者。)
HMAC SHA-256 MAC 按照 RFC 2104 生成,使用 SHA-256 作为
散列算法 "H",使用 JWS 签名输入作为 "text" 值,
并使用共享密钥。HMAC 输出值即为 JWS
签名。
以下 "alg"(算法)头部参数值用于
表示 JWS 签名是使用
相应算法计算得到的 HMAC 值:
+-------------------+--------------------+
| "alg" 参数值 | MAC 算法 |
+-------------------+--------------------+
| HS256 | 使用 SHA-256 的 HMAC |
| HS384 | 使用 SHA-384 的 HMAC |
| HS512 | 使用 SHA-512 的 HMAC |
+-------------------+--------------------+
JWS 的 HMAC SHA-256 MAC 通过按照 RFC 2104 计算 HMAC
值来验证,其中使用 SHA-256 作为散列算法 "H",使用
接收到的 JWS 签名输入作为 "text" 值,并使用
共享密钥。随后将计算出的 HMAC 值与对接收到的已编码
JWS 签名值进行 base64url 解码后的结果进行比较。计算出的 HMAC 值
与 JWS 签名值的比较必须
以恒定时间方式完成,以抵御时序攻击。
或者,可以对计算出的 HMAC 值进行 base64url 编码,
并与接收到的已编码 JWS 签名值进行比较(同样以
恒定时间方式),因为这种比较产生的结果与
比较未编码值相同。无论哪种情况,如果值匹配,
则 HMAC 验证成功。
Jones 标准轨道 [第 7 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
使用 HMAC SHA-384 和 HMAC
SHA-512 算法保护内容和进行验证的方式与 HMAC
SHA-256 的过程完全相同——只是使用相应的散列算法,
并使用相应更大的最小密钥大小和结果值:HMAC SHA-384
各为 384 位,HMAC SHA-512 各为 512 位。
使用此算法的示例见 [JWS] 的 附录 A.1。
3.3. 使用 RSASSA-PKCS1-v1_5 的数字签名
本节定义如何使用 RFC 3447 第 8.2 节 [RFC3447]
中定义的 RSASSA-PKCS1-v1_5 数字
签名算法(通常称为 PKCS #1),并使用 SHA-2 [SHS] 散列函数。
这些算法必须使用大小为 2048 位或更大的密钥。
RSASSA-PKCS1-v1_5 SHA-256 数字签名按如下方式
生成:使用 RSASSA-PKCS1-v1_5-SIGN、SHA-256 散列函数
和所需私钥,对 JWS 签名输入生成数字签名。
该结果即为 JWS 签名值。
以下 "alg"(算法)头部参数值用于
表示 JWS 签名是使用
相应算法计算得到的数字签名值:
+-------------------+---------------------------------+
| "alg" 参数值 | 数字签名算法 |
+-------------------+---------------------------------+
| RS256 | 使用 SHA-256 的 RSASSA-PKCS1-v1_5 |
| RS384 | 使用 SHA-384 的 RSASSA-PKCS1-v1_5 |
| RS512 | 使用 SHA-512 的 RSASSA-PKCS1-v1_5 |
+-------------------+---------------------------------+
JWS 的 RSASSA-PKCS1-v1_5 SHA-256 数字签名按如下方式
验证:将 JWS 签名输入、JWS
签名以及与签名者使用的私钥相对应的公钥
提交给 RSASSA-PKCS1-v1_5-VERIFY 算法,并使用 SHA-256
作为散列函数。
使用 RSASSA-PKCS1-v1_5 SHA-384 和 RSASSA-
PKCS1-v1_5 SHA-512 算法进行签名和验证的方式与
RSASSA-PKCS1-v1_5 SHA-256 的过程完全相同——只是使用
相应的散列算法代替 SHA-256。
使用此算法的示例见 [JWS] 的 附录 A.2。
Jones 标准轨道 [第 8 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
3.4. 使用 ECDSA 的数字签名
椭圆曲线数字签名算法(ECDSA)[DSS] 支持
使用椭圆曲线密码学,它能够提供
与 RSA 密码学相当的安全性,但使用更短的密钥长度,
并且许多操作具有更高的处理速度。这意味着
ECDSA 数字签名的长度将显著短于
具有同等强度的 RSA 数字签名。
本规范定义将 ECDSA 与 P-256 曲线和
SHA-256 密码散列函数配合使用,将 ECDSA 与 P-384 曲线
和 SHA-384 散列函数配合使用,以及将 ECDSA 与 P-521 曲线和
SHA-512 散列函数配合使用。P-256、P-384 和 P-521 曲线
定义于 [DSS]。
ECDSA P-256 SHA-256 数字签名按如下方式生成:
1. 使用 ECDSA
P-256 SHA-256 和所需私钥对 JWS 签名输入生成数字签名。输出将是
一对 (R, S),其中 R 和 S 是 256 位无符号整数。
2. 将 R 和 S 按大端顺序转换为八位字节序列,每个
数组长度为 32 个八位字节。这些八位字节序列
表示不得通过省略值中包含的任何前导零
八位字节而缩短。
3. 按先 R 后 S 的顺序串联这两个八位字节序列。
(请注意,许多 ECDSA 实现会直接将此
串联结果作为其输出。)
4. 得到的 64 八位字节序列即为 JWS 签名值。
以下 "alg"(算法)头部参数值用于
表示 JWS 签名是使用
相应算法计算得到的数字签名值:
+-------------------+-------------------------------+
| "alg" 参数值 | 数字签名算法 |
+-------------------+-------------------------------+
| ES256 | 使用 P-256 和 SHA-256 的 ECDSA |
| ES384 | 使用 P-384 和 SHA-384 的 ECDSA |
| ES512 | 使用 P-521 和 SHA-512 的 ECDSA |
+-------------------+-------------------------------+
Jones 标准轨道 [第 9 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
JWS 的 ECDSA P-256 SHA-256 数字签名按如下方式
验证:
1. JWS 签名值必须是一个 64 八位字节序列。如果它
不是 64 八位字节序列,则验证失败。
2. 将该 64 八位字节序列拆分为两个 32 八位字节序列。
第一个八位字节序列表示 R,第二个表示 S。值 R
和 S 使用 SEC1 [SEC1] 第 2.3.7 节中定义的整数到
八位字节串转换来表示为八位字节序列
(采用大端八位字节顺序)。
3. 将 JWS 签名输入、R、S 和公钥 (x, y) 提交给
ECDSA P-256 SHA-256 验证器。
使用 ECDSA P-384 SHA-384 和 ECDSA P-521
SHA-512 算法进行签名和验证的方式与
ECDSA P-256 SHA-256 的过程完全相同——只是使用相应的散列算法
并产生相应更大的结果值。对于 ECDSA P-384 SHA-384,
R 和 S 各为 384 位,从而产生 96 八位字节序列。对于
ECDSA P-521 SHA-512,R 和 S 各为 521 位,从而产生
132 八位字节序列。(请注意,SEC1 [SEC1] 第 2.3.7 节中定义的整数到八位字节串转换
在需要时会添加值为零的高位填充位,
以将大小向上取整为 8 位的倍数;因此,每个 521 位
整数使用 66 个八位字节中的 528 位表示。)
使用这些算法的示例见 [JWS] 的附录 A.3 和 A.4。
3.5. 使用 RSASSA-PSS 的数字签名
本节定义如何使用 RFC 3447 第 8.1 节 [RFC3447] 中定义的
RSASSA-PSS 数字签名算法,并配合
MGF1 掩码生成函数和 SHA-2 散列函数,始终对
RSASSA-PSS 散列函数和
MGF1 散列函数使用相同的散列函数。盐值的大小与
散列函数输出大小相同。所有其他算法参数使用
RFC 3447 附录 A.2.3 中指定的默认值。
此算法必须使用大小为 2048 位或更大的密钥。
RSASSA-PSS SHA-256 数字签名按如下方式生成:
使用 RSASSA-
PSS-SIGN、SHA-256 散列函数以及使用 SHA-256 的 MGF1 掩码生成
函数,并配合所需私钥,对 JWS 签名输入生成数字签名。这就是 JWS
签名值。
Jones 标准轨道 [第 10 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
以下 "alg"(算法)头部参数值用于
表示 JWS 签名是使用
相应算法计算得到的数字签名值:
+-------------------+-----------------------------------------------+
| "alg" 参数值 | 数字签名算法 |
+-------------------+-----------------------------------------------+
| PS256 | 使用 SHA-256 和 SHA-256 的 MGF1 的 |
| | RSASSA-PSS |
| PS384 | 使用 SHA-384 和 SHA-384 的 MGF1 的 |
| | RSASSA-PSS |
| PS512 | 使用 SHA-512 和 SHA-512 的 MGF1 的 |
| | RSASSA-PSS |
+-------------------+-----------------------------------------------+
JWS 的 RSASSA-PSS SHA-256 数字签名按如下方式
验证:将 JWS 签名输入、JWS 签名以及
与签名者所用私钥相对应的公钥
提交给 RSASSA-PSS-VERIFY 算法,使用 SHA-256 作为散列函数,
并使用 MGF1 作为带 SHA-256 的掩码生成函数。
使用 RSASSA-PSS SHA-384 和 RSASSA-PSS
SHA-512 算法进行签名和验证的方式与
RSASSA-PSS SHA-256 的过程完全相同——只是
在两个角色中使用另一种散列算法。
3.6. 使用算法 "none"
也可以创建不提供完整性保护的 JWS。
这样的 JWS 称为不安全 JWS。不安全 JWS 使用
"alg" 值 "none",其格式与其他 JWS 完全相同,但
必须使用空八位字节序列作为其 JWS 签名值。
接收方必须验证 JWS 签名值是空
八位字节序列。
支持不安全 JWS 的实现不得将此类
对象视为有效,除非应用程序明确指定
对某个特定对象不提供完整性保护是可以接受的。
实现默认不得接受不安全 JWS。为了
缓解降级攻击,应用程序不得在全局级别
表示接受不安全 JWS,并且应该
针对每个对象分别表示接受。有关使用此算法的安全
注意事项,请参阅 第 8.5 节。
4. 用于密钥管理的密码算法
JWE 使用密码算法来加密或确定内容
加密密钥(CEK)。
Jones 标准轨道 [第 11 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
4.1. JWE 的 "alg"(算法)头部参数值
下表列出了本规范定义的供 JWE 使用的
"alg"(算法)头部参数值集合。
这些算法用于加密 CEK,产生 JWE
加密密钥,或者使用密钥协商来协商 CEK。
+--------------------+--------------------+--------+----------------+
| "alg" 参数值 | 密钥管理 | 更多 | 实现 |
| | 算法 | 头部 | 要求 |
| | | 参数 | |
+--------------------+--------------------+--------+----------------+
| RSA1_5 | RSAES-PKCS1-v1_5 | (无) | 推荐- |
| RSA-OAEP | 使用默认参数的 | (无) | 推荐+ |
| | RSAES OAEP | | |
| RSA-OAEP-256 | 使用 SHA-256 和 | (无) | 可选 |
| | SHA-256 的 MGF1 的 | | |
| | RSAES OAEP | | |
| A128KW | 使用默认初始值的 | (无) | 推荐 |
| | AES Key Wrap, | | |
| | 使用 | | |
| | 128 位密钥 | | |
| A192KW | 使用默认初始值的 | (无) | 可选 |
| | AES Key Wrap, | | |
| | 使用 | | |
| | 192 位密钥 | | |
| A256KW | 使用默认初始值的 | (无) | 推荐 |
| | AES Key Wrap, | | |
| | 使用 | | |
| | 256 位密钥 | | |
| dir | 将共享对称 | (无) | 推荐 |
| | 密钥直接用作 | | |
| | CEK | | |
| ECDH-ES | 椭圆曲线 | "epk", | 推荐+ |
| | Diffie-Hellman | "apu", | |
| | 临时-静态 | "apv" | |
| | 密钥协商 | | |
| | 使用 Concat KDF | | |
| ECDH-ES+A128KW | 使用 Concat KDF | "epk", | 推荐 |
| | 的 ECDH-ES,并用 | "apu", | |
| | "A128KW" 包装 | "apv" | |
| | CEK | | |
| ECDH-ES+A192KW | 使用 Concat KDF | "epk", | 可选 |
| | 的 ECDH-ES,并用 | "apu", | |
| | "A192KW" 包装 | "apv" | |
| | CEK | | |
Jones 标准轨道 [第 12 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
| ECDH-ES+A256KW | 使用 Concat KDF | "epk", | 推荐 |
| | 的 ECDH-ES,并用 | "apu", | |
| | "A256KW" 包装 | "apv" | |
| | CEK | | |
| A128GCMKW | 使用 AES GCM | "iv", | 可选 |
| | 包装密钥,使用 | "tag" | |
| | 128 位密钥 | | |
| A192GCMKW | 使用 AES GCM | "iv", | 可选 |
| | 包装密钥,使用 | "tag" | |
| | 192 位密钥 | | |
| A256GCMKW | 使用 AES GCM | "iv", | 可选 |
| | 包装密钥,使用 | "tag" | |
| | 256 位密钥 | | |
| PBES2-HS256+A128KW | PBES2 与 HMAC | "p2s", | 可选 |
| | SHA-256 和 | "p2c" | |
| | "A128KW" 包装 | | |
| PBES2-HS384+A192KW | PBES2 与 HMAC | "p2s", | 可选 |
| | SHA-384 和 | "p2c" | |
| | "A192KW" 包装 | | |
| PBES2-HS512+A256KW | PBES2 与 HMAC | "p2s", | 可选 |
| | SHA-512 和 | "p2c" | |
| | "A256KW" 包装 | | |
+--------------------+--------------------+--------+----------------+
“更多头部参数”列表示除所有算法都使用的 "alg" 外,
该算法还使用哪些附加头部
参数。
除 "dir" 和 "ECDH-ES" 外,其他算法也都会产生 JWE 加密密钥值。
实现要求列中的“+”表示
该要求的强度很可能会在规范未来版本中提高。
“-”表示该
要求的强度很可能会在规范未来版本中
降低。
有关将本规范中定义的 JWE "alg"
(算法)值与其他标准和软件包使用的等效
标识符进行交叉引用的表,请参阅 附录 A.2。
4.2. 使用 RSAES-PKCS1-v1_5 的密钥加密
本节定义使用
RSAES-PKCS1-v1_5 [RFC3447] 加密 JWE CEK 的具体方法。此算法使用
"alg"(算法)头部参数值 "RSA1_5"。
此算法必须使用大小为 2048 位或更大的密钥。
使用此算法的示例见 [JWE] 的 附录 A.2。
Jones 标准轨道 [第 13 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
4.3. 使用 RSAES OAEP 的密钥加密
本节定义使用 RSAES
和最优非对称加密填充(OAEP)[RFC3447] 加密 JWE CEK 的具体方法。这里定义了两
组使用 OAEP 的参数,它们使用不同的
散列函数。在第一种情况下,使用
RFC 3447 附录 A.2.1 中指定的默认参数。(这些默认参数
是 SHA-1 散列函数和使用 SHA-1 的 MGF1 掩码生成
函数。)在第二种情况下,使用 SHA-256 散列函数和
使用 SHA-256 的 MGF1 掩码生成函数。
以下 "alg"(算法)头部参数值用于
表示 JWE 加密密钥是使用
相应算法加密 CEK 的结果:
+-------------------+-----------------------------------------------+
| "alg" 参数值 | 密钥管理算法 |
+-------------------+-----------------------------------------------+
| RSA-OAEP | 使用默认参数的 RSAES OAEP |
| RSA-OAEP-256 | 使用 SHA-256 和 SHA-256 的 MGF1 的 |
| | RSAES OAEP |
+-------------------+-----------------------------------------------+
这些算法必须使用大小为 2048 位或更大的密钥。
(此要求基于 NIST SP 800-57 [NIST.800-57] 的表 4(安全强度时间框架),
该表要求新用途具有 112 位安全强度,
以及同一文档的表 2(可比强度),其中
指出 2048 位 RSA 密钥提供 112 位安全强度。)
使用默认参数的 RSAES OAEP 示例见
[JWE] 的 附录 A.1。
4.4. 使用 AES Key Wrap 的密钥包装
本节定义使用高级加密标准(AES)密钥包装算法
[RFC3394],并采用该
文档 第 2.2.3.1 节中指定的默认初始值来加密 JWE CEK 的具体方法。
Jones 标准轨道 [第 14 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
以下 "alg"(算法)头部参数值用于
表示 JWE 加密密钥是使用
相应算法和密钥大小加密 CEK 的结果:
+-----------------+-------------------------------------------------+
| "alg" 参数 | 密钥管理算法 |
| 值 | |
+-----------------+-------------------------------------------------+
| A128KW | 使用默认初始值和 128 位密钥的 AES Key Wrap |
| | |
| A192KW | 使用默认初始值和 192 位密钥的 AES Key Wrap |
| | |
| A256KW | 使用默认初始值和 256 位密钥的 AES Key Wrap |
| | |
+-----------------+-------------------------------------------------+
使用此算法的示例见 [JWE] 的 附录 A.3。
4.5. 使用共享对称密钥的直接加密
本节定义在不执行密钥包装步骤的情况下
直接进行对称密钥加密的具体方法。在这种情况下,
共享对称密钥直接用作 "enc" 算法的内容加密
密钥(CEK)值。空八位字节序列
用作 JWE 加密密钥值。在这种情况下使用 "alg"(算法)头部
参数值 "dir"。
在考虑使用直接
加密时,请参阅 第 8.2 节中有关密钥生命周期的安全注意事项
以及 第 8.4 节中有关 AES GCM 的安全注意事项。
4.6. 使用椭圆曲线 Diffie-Hellman 临时-静态进行密钥协商
(ECDH-ES)
本节定义将椭圆曲线
Diffie-Hellman 临时-静态 [RFC6090] 与
[NIST.800-56A] 第 5.8.1 节中定义的 Concat KDF 结合进行密钥协商的具体方法。
密钥协商结果可以以下两种方式之一使用:
1. 在直接密钥协商模式下,直接作为 "enc"
算法的内容加密密钥(CEK),或者
2. 在带密钥包装的密钥协商模式下,作为对称密钥,
使用 "A128KW"、"A192KW" 或 "A256KW" 算法包装 CEK。
每次密钥协商操作都必须生成新的临时公钥值。
Jones 标准轨道 [第 15 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
在直接密钥协商模式下,Concat KDF 的输出必须是
与 "enc" 算法所使用密钥相同长度的密钥。在这种
情况下,空八位字节序列用作 JWE 加密密钥
值。在直接密钥协商模式下使用
"alg"(算法)头部参数值 "ECDH-ES"。
在带密钥包装的密钥协商模式下,Concat KDF 的输出
必须是指定密钥包装
算法所需长度的密钥。在这种情况下,JWE 加密密钥是使用
协商得到的密钥包装后的 CEK。
以下 "alg"(算法)头部参数值用于
表示 JWE 加密密钥是使用密钥协商算法的结果作为
相应密钥包装算法的密钥
加密密钥来加密 CEK 的结果:
+-----------------+-------------------------------------------------+
| "alg" 参数 | 密钥管理算法 |
| 值 | |
+-----------------+-------------------------------------------------+
| ECDH-ES+A128KW | 使用 Concat KDF 的 ECDH-ES,并使用 |
| | "A128KW" 包装 CEK |
| ECDH-ES+A192KW | 使用 Concat KDF 的 ECDH-ES,并使用 |
| | "A192KW" 包装 CEK |
| ECDH-ES+A256KW | 使用 Concat KDF 的 ECDH-ES,并使用 |
| | "A256KW" 包装 CEK |
+-----------------+-------------------------------------------------+
4.6.1. 用于 ECDH 密钥协商的头部参数
以下头部参数名称用于下文定义的密钥协商。
4.6.1.1. "epk"(临时公钥)头部参数
"epk"(临时公钥)值由发起方创建,
用于密钥协商算法。该密钥表示为
JSON Web 密钥 [JWK] 公钥值。它必须只包含公钥
参数,并且应该只包含表示该密钥所需的最少 JWK 参数;
所包含的其他 JWK 参数可以
检查其一致性并予以采用,也可以忽略。使用这些算法时,
此头部参数必须存在,并且实现必须理解并处理
此头部参数。
Jones 标准轨道 [第 16 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
4.6.1.2. "apu"(协商 PartyUInfo)头部参数
使用该值的密钥协商算法(例如 "ECDH-ES")的
"apu"(协商 PartyUInfo)值表示为 base64url 编码的
字符串。使用时,PartyUInfo 值包含有关
生成方的信息。使用此头部参数是可选的。使用
这些算法时,实现必须理解并处理此头部
参数。
4.6.1.3. "apv"(协商 PartyVInfo)头部参数
使用该值的密钥协商算法(例如 "ECDH-ES")的
"apv"(协商 PartyVInfo)值表示为 base64url 编码的
字符串。使用时,PartyVInfo 值包含有关
接收方的信息。使用此头部参数是可选的。使用
这些算法时,实现必须理解并处理此头部
参数。
4.6.2. ECDH 密钥协商的密钥派生
密钥派生过程按照
[NIST.800-56A] 第 6.2.2.2 节,从通过 ECDH 算法建立的
共享秘密 Z 派生协商密钥。
密钥派生使用 [NIST.800-56A] 第 5.8.1 节中定义的
Concat KDF 执行,其中摘要方法为 SHA-256。
Concat KDF 参数设置如下:
Z
将其设置为共享秘密 Z 的
八位字节序列表示。
keydatalen
将其设置为所需输出密钥中的位数。对于
"ECDH-ES",这是 "enc" 算法所使用密钥的长度。
对于 "ECDH-ES+A128KW"、"ECDH-ES+A192KW" 和 "ECDH-ES+A256KW",
分别为 128、192 和 256。
AlgorithmID
AlgorithmID 值的形式为 Datalen || Data,其中 Data
是由零个或多个八位字节组成的可变长度字符串,而 Datalen 是
一个固定长度、大端 32 位计数器,用于指示
Data 的长度(以八位字节为单位)。在直接密钥协商情况下,
Data 设置为 "enc" 头部参数值的 ASCII 表示的八位字节。
在带密钥包装的密钥协商
情况下,Data 设置为
"alg"(算法)头部参数值的 ASCII 表示的八位字节。
Jones 标准轨道 [第 17 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
PartyUInfo
PartyUInfo 值的形式为 Datalen || Data,其中 Data 是
由零个或多个八位字节组成的可变长度字符串,而 Datalen 是
一个固定长度、大端 32 位计数器,用于指示 Data 的长度
(以八位字节为单位)。如果存在 "apu"(协商 PartyUInfo)头部
参数,则 Data 设置为对 "apu" 值进行 base64url
解码的结果,Datalen 设置为 Data 中的
八位字节数。否则,将 Datalen 设置为 0,将 Data 设置为
空八位字节序列。
PartyVInfo
PartyVInfo 值的形式为 Datalen || Data,其中 Data 是
由零个或多个八位字节组成的可变长度字符串,而 Datalen 是
一个固定长度、大端 32 位计数器,用于指示 Data 的长度
(以八位字节为单位)。如果存在 "apv"(协商 PartyVInfo)头部
参数,则 Data 设置为对 "apv" 值进行 base64url
解码的结果,Datalen 设置为 Data 中的
八位字节数。否则,将 Datalen 设置为 0,将 Data 设置为
空八位字节序列。
SuppPubInfo
将其设置为以 32 位大端
整数表示的 keydatalen。
SuppPrivInfo
将其设置为空八位字节序列。
应用程序需要指定在该应用程序中如何使用 "apu" 和 "apv" 头部
参数。使用时,"apu" 和 "apv" 值
必须彼此不同。希望符合
[NIST.800-56A] 的应用程序需要提供满足该文档要求的值,
例如,使用可标识生成方和
使用方的值。或者,应用程序可以采用类似
“Diffie-Hellman 密钥协商方法”[RFC2631] 的方式进行密钥派生:
在这种情况下,"apu" 参数可以省略,也可以表示
一个随机的 512 位值(类似于 RFC 2631 中临时-静态
模式下的 PartyAInfo),而 "apv" 参数不应该存在。
有关使用此方法进行密钥协商计算的示例,请参阅 附录 C。
4.7. 使用 AES GCM 的密钥加密
本节定义使用伽罗瓦/计数器模式(GCM)下的
高级加密标准(AES)来加密 JWE 内容
加密密钥(CEK)的具体方法([AES] 和 [NIST.800-38D])。
Jones 标准轨道 [第 18 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
此算法要求使用大小为 96 位的初始化向量(IV)。
IV 以 base64url 编码形式表示为
"iv"(初始化向量)头部参数值。
所使用的附加认证数据值为空
八位字节串。
请求的认证标签输出大小必须为 128 位,
与密钥大小无关。
JWE 加密密钥值即为密文输出。
认证标签输出以 base64url 编码
形式表示为 "tag"(认证标签)头部参数值。
以下 "alg"(算法)头部参数值用于
表示 JWE 加密密钥是使用
相应算法和密钥大小加密 CEK 的结果:
+-------------------+---------------------------------------------+
| "alg" 参数值 | 密钥管理算法 |
+-------------------+---------------------------------------------+
| A128GCMKW | 使用 128 位密钥的 AES GCM 进行密钥包装 |
| A192GCMKW | 使用 192 位密钥的 AES GCM 进行密钥包装 |
| A256GCMKW | 使用 256 位密钥的 AES GCM 进行密钥包装 |
+-------------------+---------------------------------------------+
4.7.1. 用于 AES GCM 密钥加密的头部参数
以下头部参数用于 AES GCM 密钥加密。
4.7.1.1. "iv"(初始化向量)头部参数
"iv"(初始化向量)头部参数值是用于
密钥加密操作的 96 位 IV 值的
base64url 编码表示。此头部参数必须存在,并且
使用这些算法时,实现必须理解并处理
此头部参数。
4.7.1.2. "tag"(认证标签)头部参数
"tag"(认证标签)头部参数值是
密钥加密操作产生的 128 位认证标签
值的 base64url 编码表示。此头部
参数必须存在,并且使用这些算法时,实现必须理解并处理
此头部参数。
Jones 标准轨道 [第 19 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
4.8. 使用 PBES2 的密钥加密
本节定义对 JWE CEK 执行基于密码的
加密的具体方法:首先使用
[RFC2898] 第 6.2 节中指定的 PBES2 方案从用户提供的密码派生密钥加密密钥,
然后使用派生的密钥加密 JWE CEK。
这些算法使用 HMAC SHA-2 算法作为 PBKDF2 密钥派生的
伪随机函数(PRF),并使用 AES Key Wrap
[RFC3394] 作为加密方案。PBES2 密码输入是一个
八位字节序列;如果要使用的密码表示为文本
字符串而不是八位字节序列,则必须使用文本
字符串的 UTF-8 编码作为该八位字节序列。盐参数必须
根据下面 "p2s" 的定义,由 "p2s"(PBES2 盐输入)头部参数值
和 "alg"(算法)头部参数值计算。
迭代次数参数必须
作为 "p2c"(PBES2 计数)头部参数值提供。这些
算法分别使用 HMAC SHA-256、HMAC SHA-384 和 HMAC
SHA-512 作为 PRF,并使用 128 位、192 位和 256 位 AES Key Wrap 密钥。
它们的派生密钥长度分别为 16、24 和 32 个八位字节。
以下 "alg"(算法)头部参数值用于
表示 JWE 加密密钥是使用相应基于密码的加密
算法结果作为相应密钥
包装算法的密钥加密密钥来加密
CEK 的结果:
+--------------------+----------------------------------------------+
| "alg" 参数值 | 密钥管理算法 |
+--------------------+----------------------------------------------+
| PBES2-HS256+A128KW | PBES2 与 HMAC SHA-256 和 "A128KW" |
| | 包装 |
| PBES2-HS384+A192KW | PBES2 与 HMAC SHA-384 和 "A192KW" |
| | 包装 |
| PBES2-HS512+A256KW | PBES2 与 HMAC SHA-512 和 "A256KW" |
| | 包装 |
+--------------------+----------------------------------------------+
有关使用 "PBES2-HS256+A128KW" 进行密钥
加密计算的示例,请参阅 JWK 规范 [JWK] 的 附录 C。
4.8.1. 用于 PBES2 密钥加密的头部参数
以下头部参数用于使用 PBES2 进行密钥
加密。
Jones 标准轨道 [第 20 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
4.8.1.1. "p2s"(PBES2 盐输入)头部参数
"p2s"(PBES2 盐输入)头部参数编码一个盐输入
值,该值作为 PBKDF2 盐值的一部分使用。"p2s"
值为 BASE64URL(Salt Input)。使用这些算法时,
此头部参数必须
存在,并且实现必须理解并处理它。
盐扩展了可从给定
密码派生出的可能密钥范围。必须使用包含 8 个或更多八位字节的
盐输入值。每次
加密操作都必须随机生成新的盐输入值;有关
生成随机值的注意事项,请参阅 RFC 4086 [RFC4086]。所使用的盐值为 (UTF8(Alg) || 0x00
|| Salt Input),其中 Alg 是 "alg"(算法)头部参数
值。
4.8.1.2. "p2c"(PBES2 计数)头部参数
"p2c"(PBES2 计数)头部参数包含 PBKDF2
迭代次数,表示为正 JSON 整数。使用这些
算法时,此头部参数必须存在,并且实现必须理解并处理
此头部参数。
迭代次数增加计算成本,理想情况下还会与
盐引入的可能密钥范围叠加。推荐
最小迭代次数为 1000。
5. 用于内容加密的密码算法
JWE 使用密码算法对明文进行加密并提供完整性保护,
同时对附加认证
数据提供完整性保护。
Jones 标准轨道 [第 21 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
5.1. JWE 的 "enc"(加密算法)头部参数值
下表列出了本规范定义的供
JWE 使用的 "enc"(加密算法)头部参数值集合。
+---------------+----------------------------------+----------------+
| "enc" 参数 | 内容加密算法 | 实现 |
| 值 | | 要求 |
+---------------+----------------------------------+----------------+
| A128CBC-HS256 | AES_128_CBC_HMAC_SHA_256 | 必需 |
| | 认证加密 | |
| | 算法,如第 | |
| | 5.2.3 节所定义 | |
| A192CBC-HS384 | AES_192_CBC_HMAC_SHA_384 | 可选 |
| | 认证加密 | |
| | 算法,如第 | |
| | 5.2.4 节所定义 | |
| A256CBC-HS512 | AES_256_CBC_HMAC_SHA_512 | 必需 |
| | 认证加密 | |
| | 算法,如第 | |
| | 5.2.5 节所定义 | |
| A128GCM | 使用 128 位密钥的 AES GCM | 推荐 |
| A192GCM | 使用 192 位密钥的 AES GCM | 可选 |
| A256GCM | 使用 256 位密钥的 AES GCM | 推荐 |
+---------------+----------------------------------+----------------+
所有这些算法还都使用 JWE 初始化向量值,并产生 JWE
密文和 JWE 认证标签值。
有关将本规范中定义的 JWE "enc"
(加密算法)值与其他标准和软件包使用的
等效标识符进行交叉引用的表,请参阅 附录 A.3。
5.2. AES_CBC_HMAC_SHA2 算法
本节定义一系列认证加密算法,
它们通过组合使用密码块链接(CBC)
模式 [NIST.800-38A] 下的 AES [AES]、按照 [RFC5652]
第 6.3 节进行的 PKCS #7 填充操作,以及 HMAC([RFC2104] 和 [SHS])操作构建而成。此
算法族称为 AES_CBC_HMAC_SHA2。它还定义了该族的三个
实例:第一个使用 128 位 CBC 密钥和 HMAC
SHA-256,第二个使用 192 位 CBC 密钥和 HMAC SHA-384,第三个
使用 256 位 CBC 密钥和 HMAC SHA-512。这些
算法的测试用例可在 附录 B 中找到。
Jones 标准轨道 [第 22 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
这些算法基于“使用 AES-
CBC 和 HMAC-SHA 的认证加密”[AEAD-CBC-SHA],执行相同的密码
计算,但初始化向量(IV)和
认证标签值保持分离,而不是在输出表示中
与密文值串联。
该选项在该规范的 附录 B 中进行了讨论。此
算法族是 [AEAD-CBC-SHA] 中算法族的泛化形式,
并可用于实现那些算法。
5.2.1. 定义 AES_CBC_HMAC_SHA2 时使用的约定
我们使用以下表示法约定。
CBC-PKCS7-ENC(X, P) 表示使用密钥 X 的密码
并利用 PKCS #7 填充对 P 执行 AES-CBC 加密。
MAC(Y, M) 表示使用密钥 Y
对消息 M 应用 MAC。
5.2.2. 通用 AES_CBC_HMAC_SHA2 算法
本节以不依赖于所使用的 AES-CBC 密钥大小
或散列函数的方式定义 AES_CBC_HMAC_SHA2。
第 5.2.2.1 节和第 5.2.2.2 节定义通用加密和
解密算法。第 5.2.3 节到第 5.2.5 节定义
AES_CBC_HMAC_SHA2 的实例,并指定这些细节。
5.2.2.1. AES_CBC_HMAC_SHA2 加密
认证加密算法接受四个八位字节
串作为输入:秘密密钥 K、明文 P、附加认证数据
A 和初始化向量 IV。认证密文
值 E 和认证标签值 T 作为输出提供。
明文中的数据被加密并认证,而
附加认证数据被认证但不加密。
加密过程如下,或者使用一组等效的
步骤:
1. 从输入密钥 K 按如下方式生成
次级密钥 MAC_KEY 和 ENC_KEY。这两个密钥都是八位字节
串。
MAC_KEY 按顺序由 K 的前 MAC_KEY_LEN 个八位字节
组成。
ENC_KEY 按顺序由 K 的后 ENC_KEY_LEN 个八位字节
组成。
Jones 标准轨道 [第 23 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
输入密钥 K 中的八位字节数必须等于
MAC_KEY_LEN 和 ENC_KEY_LEN 之和。这些参数的值由
第 5.2.3 节到 5.2.5 节中的认证加密算法
指定。请注意,在输入密钥 K 中,MAC 密钥位于
加密密钥之前;这与标识符 "AES_CBC_HMAC_SHA2"
中算法名称的顺序相反。
2. 使用的 IV 是一个为密码算法随机或
伪随机生成的 128 位值。
3. 使用 PKCS #7 填充对明文执行 CBC 加密,
其中 ENC_KEY 作为密钥,IV 作为初始化向量。我们将此步骤得到的密文输出
记为 E。
4. 八位字节串 AL 等于
附加认证数据 A 的位数,并表示为 64 位无符号
大端整数。
5. 通过按顺序对以下数据应用 HMAC
[RFC2104] 来计算消息认证标签 T:
附加认证数据 A,
初始化向量 IV,
上一步计算出的密文 E,以及
上面定义的八位字节串 AL。
字符串 MAC_KEY 用作 MAC 密钥。我们将此步骤中
计算得到的 MAC 输出记为 M。M 的前 T_LEN 个八位字节
用作 T。
6. 返回密文 E 和认证标签 T,作为
认证加密的输出。
加密过程可表示如下。这里 K、P、A、
IV 和 E 分别表示密钥、明文、附加认证数据、
初始化向量和密文。
MAC_KEY = K 的前 MAC_KEY_LEN 个八位字节,
ENC_KEY = K 的后 ENC_KEY_LEN 个八位字节,
E = CBC-PKCS7-ENC(ENC_KEY, P),
M = MAC(MAC_KEY, A || IV || E || AL),
T = M 的前 T_LEN 个八位字节。
Jones 标准轨道 [第 24 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
5.2.2.2. AES_CBC_HMAC_SHA2 解密
认证解密操作有五个输入:如上定义的 K、A、IV、E
和 T。它只有一个输出:要么是
明文值 P,要么是表示输入
未通过认证的特殊符号 FAIL。认证解密算法
如下,或者使用一组等效的步骤:
1. 按照 第 5.2.2.1 节步骤 1 的方式,从
输入密钥 K 生成次级密钥 MAC_KEY 和 ENC_KEY。
2. 通过按照
第 5.2.2.1 节步骤 5 中的输入计算 HMAC,
来检查 A 和 E 的完整性和真实性。将前一步中的值 T
与 HMAC 输出的前 MAC_KEY 长度位进行比较。如果
这些值相同,则认为 A 和 E 有效,
并继续处理。否则,丢弃 MAC 验证中使用的
所有数据,认证
解密操作返回失败指示,并
停止该操作。(但有关抵御时序攻击的安全
注意事项,请参阅 [JWE] 第 11.5 节。)
3. 解密值 E,并检查和
移除 PKCS #7 填充。值 IV 用作初始化向量。值
ENC_KEY 用作解密密钥。
4. 返回明文值。
5.2.3. AES_128_CBC_HMAC_SHA_256
此算法是上述通用
AES_CBC_HMAC_SHA2 算法的具体实例。它使用带 SHA-256 散列函数 [SHS] 的 HMAC 消息
认证码 [RFC2104] 提供消息认证,
并将 HMAC 输出截断为 128
位,对应于
[RFC4868] 中定义的 HMAC-SHA-256-128 算法。对于加密,它使用
[NIST.800-38A] 第 6.2 节中定义的 CBC 操作模式下的 AES,
配合 PKCS #7 填充和
128 位 IV 值。
AES_128_CBC_HMAC_SHA_256 特有的 AES_CBC_HMAC_SHA2 参数
为:
输入密钥 K 的长度为 32 个八位字节。
ENC_KEY_LEN 为 16 个八位字节。
MAC_KEY_LEN 为 16 个八位字节。
HMAC 使用 SHA-256 散列算法。
HMAC-SHA-256 输出被截断为 T_LEN=16 个八位字节,方法是
去掉最后 16 个八位字节。
Jones 标准轨道 [第 25 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
5.2.4. AES_192_CBC_HMAC_SHA_384
AES_192_CBC_HMAC_SHA_384 基于 AES_128_CBC_HMAC_SHA_256,但
有以下区别:
输入密钥 K 的长度为 48 个八位字节,而不是 32 个。
ENC_KEY_LEN 为 24 个八位字节,而不是 16 个。
MAC_KEY_LEN 为 24 个八位字节,而不是 16 个。
HMAC 使用 SHA-384,而不是 SHA-256。
HMAC SHA-384 值被截断为 T_LEN=24 个八位字节,而不是
16 个。
5.2.5. AES_256_CBC_HMAC_SHA_512
AES_256_CBC_HMAC_SHA_512 基于 AES_128_CBC_HMAC_SHA_256,但
有以下区别:
输入密钥 K 的长度为 64 个八位字节,而不是 32 个。
ENC_KEY_LEN 为 32 个八位字节,而不是 16 个。
MAC_KEY_LEN 为 32 个八位字节,而不是 16 个。
HMAC 使用 SHA-512,而不是 SHA-256。
HMAC SHA-512 值被截断为 T_LEN=32 个八位字节,而不是
16 个。
5.2.6. 使用 AES_CBC_HMAC_SHA2 的内容加密
本节定义使用
AES_CBC_HMAC_SHA2 算法执行认证加密的具体方法。
CEK 用作秘密密钥 K。
以下 "enc"(加密算法)头部参数值用于
表示 JWE 密文和 JWE 认证
标签值已使用相应算法计算:
+---------------+---------------------------------------------------+
| "enc" 参数 | 内容加密算法 |
| 值 | |
+---------------+---------------------------------------------------+
| A128CBC-HS256 | AES_128_CBC_HMAC_SHA_256 认证加密算法 |
| | ,如第 5.2.3 节所定义 |
| A192CBC-HS384 | AES_192_CBC_HMAC_SHA_384 认证加密算法 |
| | ,如第 5.2.4 节所定义 |
| A256CBC-HS512 | AES_256_CBC_HMAC_SHA_512 认证加密算法 |
| | ,如第 5.2.5 节所定义 |
+---------------+---------------------------------------------------+
Jones 标准轨道 [第 26 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
5.3. 使用 AES GCM 的内容加密
本节定义使用伽罗瓦/计数器模式(GCM)下的 AES
执行认证加密的具体方法([AES] 和
[NIST.800-38D])。
CEK 用作加密密钥。
此算法要求使用大小为 96 位的 IV。
请求的认证标签输出大小必须为 128 位,
与密钥大小无关。
以下 "enc"(加密算法)头部参数值用于
表示 JWE 密文和 JWE 认证
标签值已使用相应算法和
密钥大小计算:
+-------------------+------------------------------+
| "enc" 参数值 | 内容加密算法 |
+-------------------+------------------------------+
| A128GCM | 使用 128 位密钥的 AES GCM |
| A192GCM | 使用 192 位密钥的 AES GCM |
| A256GCM | 使用 256 位密钥的 AES GCM |
+-------------------+------------------------------+
使用此算法的示例见 [JWE] 的 附录 A.1。
6. 用于密钥的密码算法
JSON Web 密钥(JWK)[JWK] 是表示
密码密钥的 JSON 数据结构。这些密钥可以是非对称的,也可以是对称的。
它们可以同时包含有关密钥的公开和私有信息。
本节定义使用本文档所指定算法的密钥
参数。
Jones 标准轨道 [第 27 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
6.1. "kty"(密钥类型)参数值
下表列出了本规范定义的供 JWK 使用的
"kty"(密钥类型)参数值集合。
+-------------+--------------------------------+--------------------+
| "kty" 参数 | 密钥类型 | 实现 |
| 值 | | 要求 |
+-------------+--------------------------------+--------------------+
| EC | 椭圆曲线 [DSS] | 推荐+ |
| RSA | RSA [RFC3447] | 必需 |
| oct | 八位字节序列(用于 | 必需 |
| | 表示对称密钥) | |
+-------------+--------------------------------+--------------------+
实现要求列中的“+”表示
该要求的强度很可能会在规范的未来
版本中提高。
6.2. 椭圆曲线密钥的参数
JWK 可以表示椭圆曲线 [DSS] 密钥。在这种情况下,
"kty" 成员值为 "EC"。
6.2.1. 椭圆曲线公钥的参数
椭圆曲线公钥由取自有限域的一对坐标
表示,这两个坐标共同定义椭圆曲线上的一个点。
所有椭圆曲线公钥都必须包含以下
成员:
o "crv"
o "x"
对于下一节中定义的三条曲线的椭圆曲线公钥,
还必须存在以下成员:
o "y"
6.2.1.1. "crv"(曲线)参数
"crv"(曲线)参数标识该密钥所使用的密码曲线。
本规范使用的 [DSS] 曲线值
为:
o "P-256"
o "P-384"
o "P-521"
Jones 标准轨道 [第 28 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
这些值注册在 第 7.6 节中定义的 IANA“JSON Web 密钥椭圆曲线”
注册表中。其他规范可以注册额外的 "crv" 值。
注册额外曲线的规范必须定义用于表示
所注册曲线密钥的参数。"crv" 值是区分大小写的
字符串。
对于这三条曲线中的任何一条,都不支持 SEC1 [SEC1] 点压缩。
6.2.1.2. "x"(X 坐标)参数
"x"(x 坐标)参数包含椭圆曲线点的
x 坐标。它表示为该坐标八位字节串表示形式的
base64url 编码,该表示形式定义于
SEC1 [SEC1] 的 第 2.3.5 节。该八位字节串的长度必须
等于 "crv" 参数指定曲线的完整坐标大小。
例如,如果 "crv" 的值为 "P-521",则该八位字节
串的长度必须为 66 个八位字节。
6.2.1.3. "y"(Y 坐标)参数
"y"(y 坐标)参数包含椭圆曲线点的
y 坐标。它表示为该坐标八位字节串表示形式的
base64url 编码,该表示形式定义于
SEC1 [SEC1] 的 第 2.3.5 节。该八位字节串的长度必须
等于 "crv" 参数指定曲线的完整坐标大小。
例如,如果 "crv" 的值为 "P-521",则该八位字节
串的长度必须为 66 个八位字节。
6.2.2. 椭圆曲线私钥的参数
除用于表示椭圆曲线公钥的成员外,
还必须存在以下成员才能表示椭圆曲线
私钥。
6.2.2.1. "d"(ECC 私钥)参数
"d"(ECC 私钥)参数包含椭圆曲线
私钥值。它表示为私钥值八位字节串表示形式的
base64url 编码,该表示形式定义于
SEC1 [SEC1] 的 第 2.3.7 节。该八位字节串的长度
必须为 ceiling(log-base-2(n)/8) 个八位字节(其中 n 是
曲线的阶)。
Jones 标准轨道 [第 29 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
6.3. RSA 密钥的参数
JWK 可以表示 RSA [RFC3447] 密钥。在这种情况下,"kty"
成员值为 "RSA"。下面定义的参数语义
与 RFC 3447 第 3.1 节和第 3.2 节中定义的相同。
6.3.1. RSA 公钥的参数
RSA 公钥必须包含以下成员。
6.3.1.1. "n"(模数)参数
"n"(模数)参数包含 RSA
公钥的模数值。它表示为 Base64urlUInt 编码值。
请注意,实现者发现某些密码库
会在其返回的模数表示前添加一个额外的值为零的八位字节,
例如,对于 2048 位密钥返回 257 个八位字节,而不是
256 个。使用此类库的实现需要
注意从 base64url 编码的
表示中省略这个额外的八位字节。
6.3.1.2. "e"(指数)参数
"e"(指数)参数包含 RSA
公钥的指数值。它表示为 Base64urlUInt 编码值。
例如,在表示值 65537 时,要进行 base64url 编码的八位字节序列
必须由三个八位字节 [1, 0, 1] 组成;
此值最终得到的表示为 "AQAB"。
6.3.2. RSA 私钥的参数
除用于表示 RSA 公钥的成员外,
以下成员用于表示 RSA 私钥。
RSA 私钥要求包含参数 "d"。其他参数可用于
优化,因此表示 RSA 私钥的 JWK 的生成方
应该包含这些参数。如果生成方包含任何其他
私钥参数,则必须包含所有其他参数,
但 "oth" 除外;只有在使用两个以上
素因子时才必须存在 "oth"。
6.3.2.1. "d"(私有指数)参数
"d"(私有指数)参数包含 RSA 私钥的私有指数
值。它表示为 Base64urlUInt
编码值。
Jones 标准轨道 [第 30 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
6.3.2.2. "p"(第一素因子)参数
"p"(第一素因子)参数包含第一素
因子。它表示为 Base64urlUInt 编码值。
6.3.2.3. "q"(第二素因子)参数
"q"(第二素因子)参数包含第二素
因子。它表示为 Base64urlUInt 编码值。
6.3.2.4. "dp"(第一因子 CRT 指数)参数
"dp"(第一因子 CRT 指数)参数包含第一因子的中国
剩余定理(CRT)指数。它表示为
Base64urlUInt 编码值。
6.3.2.5. "dq"(第二因子 CRT 指数)参数
"dq"(第二因子 CRT 指数)参数包含第二因子的 CRT
指数。它表示为 Base64urlUInt
编码值。
6.3.2.6. "qi"(第一 CRT 系数)参数
"qi"(第一 CRT 系数)参数包含第二因子的 CRT
系数。它表示为
Base64urlUInt 编码值。
6.3.2.7. "oth"(其他素数信息)参数
"oth"(其他素数信息)参数包含一个
数组,其中保存第三个及其后所有素数的信息(如果存在)。
当只使用两个素数时(通常情况),此参数
必须省略。当使用三个或更多素数时,
数组元素的数量必须等于所使用素数数量减二。
有关这种情况的更多信息,请参阅
RFC 3447 附录 A.1.2 [RFC3447] 中对
OtherPrimeInfo 参数的描述,
以下参数即以其为模型。如果
JWK 的使用方不支持包含两个以上素数的私钥,而它
遇到包含 "oth" 参数的私钥,则
不得使用该密钥。每个数组元素必须是一个包含以下成员的
对象。
6.3.2.7.1. "r"(素因子)
"oth" 数组成员中的 "r"(素因子)参数
表示后续素因子的值。它表示为
Base64urlUInt 编码值。
Jones 标准轨道 [第 31 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
6.3.2.7.2. "d"(因子 CRT 指数)
"oth" 数组成员中的 "d"(因子 CRT 指数)参数
表示相应素因子的 CRT 指数。它
表示为 Base64urlUInt 编码值。
6.3.2.7.3. "t"(因子 CRT 系数)
"oth" 数组成员中的 "t"(因子 CRT 系数)参数
表示相应素因子的 CRT 系数。它
表示为 Base64urlUInt 编码值。
6.4. 对称密钥的参数
当 JWK 的 "kty" 成员值为 "oct"(八位字节序列)时,成员
"k"(见 第 6.4.1 节)用于表示对称密钥(或
值为单个八位字节序列的其他密钥)。还应该存在 "alg" 成员,
用于标识计划与该密钥一起使用的算法,
除非应用程序使用其他方式或约定
来确定所使用的算法。
6.4.1. "k"(密钥值)参数
"k"(密钥值)参数包含对称密钥(或
其他单值密钥)的值。它表示为
包含密钥值的八位字节序列的 base64url
编码。
7. IANA 注意事项
以下注册过程用于本规范
建立的所有注册表。
值的注册过程为“需要规范”
[RFC5226],需先在
jose-reg-review@ietf.org 邮件列表上经过三周审查,并听取一名或多名
指定专家的意见。但是,为允许在规范发布前
分配值,只要指定专家确信
相关规范将会发布,就可以批准注册。
发送到邮件列表供审查的注册请求应该使用
适当的主题(例如,“请求注册算法:
example”)。
在审查期内,指定专家将批准
或拒绝注册请求,并将该决定通知
审查列表和 IANA。拒绝时应该包含说明,并且在
适用的情况下,给出如何使请求成功的建议。
Jones 标准轨道 [第 32 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
对于超过
21 天仍未确定的注册请求,可以提交给 IESG(使用
iesg@ietf.org 邮件列表)处理。
指定专家应该采用的标准包括:
判断拟议注册是否与现有
功能重复、它是否可能具有普遍适用性,还是
仅对单个应用程序有用,以及注册
描述是否清晰。
IANA 必须只接受来自指定专家的注册表更新,
并且应该将所有注册请求转交到审查邮件
列表。
建议任命多名指定专家,他们能够
代表使用本规范的不同应用程序的观点,
从而使注册决定能够得到广泛而充分的信息支持。
如果某项注册决定可能被认为会
使某位特定专家产生利益冲突,
该专家应该服从其他
专家的判断。
7.1. JSON Web 签名和加密算法注册表
本规范为 JWS 和 JWE 的 "alg"
(算法)和 "enc"(加密算法)头部参数值建立 IANA“JSON Web 签名和
加密算法”注册表。该
注册表记录算法名称、算法描述、算法使用位置、
实现要求、变更控制者以及定义
该算法的规范引用。同一个算法名称可以注册多次,
前提是其使用位置集合互不相交。
当注册同一算法的多个变体,而这些变体使用
不同长度的密钥,并且每个变体的密钥长度需要固定
(例如,因为它们将由
密钥派生函数创建)时,建议在
算法名称中包含密钥长度。这使 JSON 文本的读者能够
更容易作出安全决策。
指定专家应该进行合理的尽职调查,以确认
所注册的算法当前被认为在密码学上
可信,或者其注册状态为“已弃用”或
“禁止”。
Jones 标准轨道 [第 33 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
随着密码学环境的发展,算法的实现要求可能会随时间而
改变,例如,将算法的状态更改为“已弃用”,或者将
算法的状态从“可选”更改为“推荐+”或“必需”。只有在
指定专家审查后,才能按照“需要规范”的方式更改实现
要求,并由新的规范定义修订后的实现要求级别。
7.1.1. 注册模板
算法名称:
请求的名称(例如,"HS256")。该名称是区分大小写的
ASCII 字符串。除非指定专家指出有充分理由允许
例外,否则名称不得以不区分大小写的方式与其他已注册名称
匹配。
算法描述:
算法的简要描述(例如,“使用 SHA-256 的 HMAC”)。
算法使用位置:
算法的使用位置。如果算法将用于 JWS 或
JWE,则此项必须是一个或多个值 "alg" 或 "enc"。
如果算法标识符将用作 JWK "alg" 成员值,但不会用于 JWS 或
JWE,则使用值 "JWK";例如,非认证
加密算法可能属于这种情况。经指定专家批准,
也可以使用其他值。
JOSE 实现要求:
JWS 和 JWE 的算法实现要求,必须是
“必需”、“推荐”、“可选”、“已弃用”或“禁止”之一。
可选地,该词后面可以跟随 "+" 或
"-"。“+”表示该要求的强度
很可能会在规范的未来版本中提高。
“-”表示该要求的强度很可能
会在规范的未来版本中降低。任何为非认证加密算法
或其他不适合直接作为 JWS 或 JWE
算法使用的算法注册的标识符,都必须注册为“禁止”。
变更控制者:
对于标准轨道 RFC,列出 "IESG"。对于其他情况,给出
负责方的名称。也可以包含其他详细信息(例如,邮政
地址、电子邮件地址、主页 URI)。
Jones 标准轨道 [第 34 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
规范文档:
对指定该参数的一个或多个文档的引用,
最好包括可用于获取这些文档副本的 URI。
也可以包含相关章节的指示,但这不是
必需的。
算法分析文档:
对知名密码学会议、国家标准机构或
其他权威来源中分析待注册算法密码学可靠性的
一个或多个出版物的引用。除非
算法注册为“已弃用”或“禁止”,否则指定专家可以
要求随注册请求提供令人信服的
新算法密码学可靠性证据。
由于已经通过工作组和 IETF 审查,
本文档进行的初始注册无需
提供此信息。
7.1.2. 初始注册表内容
o 算法名称:"HS256"
o 算法描述:使用 SHA-256 的 HMAC
o 算法使用位置:"alg"
o JOSE 实现要求:必需
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.2 节
o 算法分析文档:不适用
o 算法名称:"HS384"
o 算法描述:使用 SHA-384 的 HMAC
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.2 节
o 算法分析文档:不适用
o 算法名称:"HS512"
o 算法描述:使用 SHA-512 的 HMAC
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.2 节
o 算法分析文档:不适用
Jones 标准轨道 [第 35 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"RS256"
o 算法描述:使用 SHA-256 的 RSASSA-PKCS1-v1_5
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.3 节
o 算法分析文档:不适用
o 算法名称:"RS384"
o 算法描述:使用 SHA-384 的 RSASSA-PKCS1-v1_5
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.3 节
o 算法分析文档:不适用
o 算法名称:"RS512"
o 算法描述:使用 SHA-512 的 RSASSA-PKCS1-v1_5
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.3 节
o 算法分析文档:不适用
o 算法名称:"ES256"
o 算法描述:使用 P-256 和 SHA-256 的 ECDSA
o 算法使用位置:"alg"
o JOSE 实现要求:推荐+
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.4 节
o 算法分析文档:不适用
o 算法名称:"ES384"
o 算法描述:使用 P-384 和 SHA-384 的 ECDSA
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.4 节
o 算法分析文档:不适用
o 算法名称:"ES512"
o 算法描述:使用 P-521 和 SHA-512 的 ECDSA
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.4 节
o 算法分析文档:不适用
Jones 标准轨道 [第 36 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"PS256"
o 算法描述:使用 SHA-256 和 MGF1 的 RSASSA-PSS,其中 MGF1 使用
SHA-256
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.5 节
o 算法分析文档:不适用
o 算法名称:"PS384"
o 算法描述:使用 SHA-384 和 MGF1 的 RSASSA-PSS,其中 MGF1 使用
SHA-384
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.5 节
o 算法分析文档:不适用
o 算法名称:"PS512"
o 算法描述:使用 SHA-512 和 MGF1 的 RSASSA-PSS,其中 MGF1 使用
SHA-512
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.5 节
o 算法分析文档:不适用
o 算法名称:"none"
o 算法描述:不执行数字签名或 MAC
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 3.6 节
o 算法分析文档:不适用
o 算法名称:"RSA1_5"
o 算法描述:RSAES-PKCS1-v1_5
o 算法使用位置:"alg"
o JOSE 实现要求:推荐-
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.2 节
o 算法分析文档:不适用
Jones 标准轨道 [第 37 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"RSA-OAEP"
o 算法描述:使用默认参数的 RSAES OAEP
o 算法使用位置:"alg"
o JOSE 实现要求:推荐+
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.3 节
o 算法分析文档:不适用
o 算法名称:"RSA-OAEP-256"
o 算法描述:使用 SHA-256 和 MGF1 的 RSAES OAEP,其中 MGF1 使用
SHA-256
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.3 节
o 算法分析文档:不适用
o 算法名称:"A128KW"
o 算法描述:使用 128 位密钥的 AES Key Wrap
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.4 节
o 算法分析文档:不适用
o 算法名称:"A192KW"
o 算法描述:使用 192 位密钥的 AES Key Wrap
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.4 节
o 算法分析文档:不适用
o 算法名称:"A256KW"
o 算法描述:使用 256 位密钥的 AES Key Wrap
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.4 节
o 算法分析文档:不适用
o 算法名称:"dir"
o 算法描述:直接使用共享对称密钥
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.5 节
o 算法分析文档:不适用
Jones 标准轨道 [第 38 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"ECDH-ES"
o 算法描述:使用 Concat KDF 的 ECDH-ES
o 算法使用位置:"alg"
o JOSE 实现要求:推荐+
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6 节
o 算法分析文档:不适用
o 算法名称:"ECDH-ES+A128KW"
o 算法描述:使用 Concat KDF 和 "A128KW"
包装的 ECDH-ES
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6 节
o 算法分析文档:不适用
o 算法名称:"ECDH-ES+A192KW"
o 算法描述:使用 Concat KDF 和 "A192KW"
包装的 ECDH-ES
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6 节
o 算法分析文档:不适用
o 算法名称:"ECDH-ES+A256KW"
o 算法描述:使用 Concat KDF 和 "A256KW"
包装的 ECDH-ES
o 算法使用位置:"alg"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6 节
o 算法分析文档:不适用
o 算法名称:"A128GCMKW"
o 算法描述:使用 128 位密钥的 AES GCM 进行密钥包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.7 节
o 算法分析文档:不适用
Jones 标准轨道 [第 39 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"A192GCMKW"
o 算法描述:使用 192 位密钥的 AES GCM 进行密钥包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.7 节
o 算法分析文档:不适用
o 算法名称:"A256GCMKW"
o 算法描述:使用 256 位密钥的 AES GCM 进行密钥包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.7 节
o 算法分析文档:不适用
o 算法名称:"PBES2-HS256+A128KW"
o 算法描述:PBES2 与 HMAC SHA-256 和 "A128KW"
包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.8 节
o 算法分析文档:不适用
o 算法名称:"PBES2-HS384+A192KW"
o 算法描述:PBES2 与 HMAC SHA-384 和 "A192KW"
包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.8 节
o 算法分析文档:不适用
o 算法名称:"PBES2-HS512+A256KW"
o 算法描述:PBES2 与 HMAC SHA-512 和 "A256KW"
包装
o 算法使用位置:"alg"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.8 节
o 算法分析文档:不适用
Jones 标准轨道 [第 40 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"A128CBC-HS256"
o 算法描述:AES_128_CBC_HMAC_SHA_256 认证
加密算法
o 算法使用位置:"enc"
o JOSE 实现要求:必需
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.2.3 节
o 算法分析文档:不适用
o 算法名称:"A192CBC-HS384"
o 算法描述:AES_192_CBC_HMAC_SHA_384 认证
加密算法
o 算法使用位置:"enc"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.2.4 节
o 算法分析文档:不适用
o 算法名称:"A256CBC-HS512"
o 算法描述:AES_256_CBC_HMAC_SHA_512 认证
加密算法
o 算法使用位置:"enc"
o JOSE 实现要求:必需
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.2.5 节
o 算法分析文档:不适用
o 算法名称:"A128GCM"
o 算法描述:使用 128 位密钥的 AES GCM
o 算法使用位置:"enc"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.3 节
o 算法分析文档:不适用
o 算法名称:"A192GCM"
o 算法描述:使用 192 位密钥的 AES GCM
o 算法使用位置:"enc"
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.3 节
o 算法分析文档:不适用
Jones 标准轨道 [第 41 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 算法名称:"A256GCM"
o 算法描述:使用 256 位密钥的 AES GCM
o 算法使用位置:"enc"
o JOSE 实现要求:推荐
o 变更控制者:IESG
o 规范文档:RFC 7518 第 5.3 节
o 算法分析文档:不适用
7.2. 头部参数名称注册
本节将在本规范第
4.6.1、4.7.1 和 4.8.1 节中定义的头部参数名称注册到由
[JWS] 建立的 IANA“JSON Web
签名和加密头部参数”注册表中。
7.2.1. 注册表内容
o 头部参数名称:"epk"
o 头部参数描述:临时公钥
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6.1.1 节
o 头部参数名称:"apu"
o 头部参数描述:协商 PartyUInfo
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6.1.2 节
o 头部参数名称:"apv"
o 头部参数描述:协商 PartyVInfo
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.6.1.3 节
o 头部参数名称:"iv"
o 头部参数描述:初始化向量
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.7.1.1 节
o 头部参数名称:"tag"
o 头部参数描述:认证标签
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.7.1.2 节
Jones 标准轨道 [第 42 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 头部参数名称:"p2s"
o 头部参数描述:PBES2 盐输入
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.8.1.1 节
o 头部参数名称:"p2c"
o 头部参数描述:PBES2 计数
o 头部参数使用位置:JWE
o 变更控制者:IESG
o 规范文档:RFC 7518 第 4.8.1.2 节
7.3. JSON Web 加密压缩算法注册表
本规范为 JWE "zip" 成员值建立 IANA“JSON Web 加密
压缩算法”注册表。该
注册表记录压缩算法值以及定义
该算法的规范引用。
7.3.1. 注册模板
压缩算法值:
请求的名称(例如,"DEF")。由于本
规范的一个核心目标是使生成的表示形式保持紧凑,
因此推荐使用较短的名称——除非有充分理由,
否则不超过 8 个
字符。该名称区分大小写。除非指定专家指出
有充分理由允许例外,否则名称不得以
不区分大小写的方式与其他已注册名称匹配。
压缩算法描述:
压缩算法的简要描述(例如,"DEFLATE")。
变更控制者:
对于标准轨道 RFC,列出 "IESG"。对于其他情况,给出
负责方的名称。也可以包含其他详细信息(例如,邮政地址、
电子邮件地址、主页 URI)。
规范文档:
对指定该参数的一个或多个文档的引用,
最好包括可用于获取这些文档副本的 URI。
也可以包含相关章节的指示,但这不是
必需的。
Jones 标准轨道 [第 43 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
7.3.2. 初始注册表内容
o 压缩算法值:"DEF"
o 压缩算法描述:DEFLATE
o 变更控制者:IESG
o 规范文档:JSON Web 加密(JWE)[JWE]
7.4. JSON Web 密钥类型注册表
本规范为 JWK "kty"(密钥类型)参数的值建立
IANA“JSON Web 密钥类型”注册表。该注册表
记录 "kty" 值、实现要求以及对定义
该值的规范的引用。
随着密码学环境的发展,密钥类型的实现要求可能会
随时间改变,例如,将密钥类型的状态
更改为“已弃用”,或者将密钥类型的状态从“可选”更改为
“推荐+”或“必需”。只有在指定专家审查后,
才允许按照“需要规范”的方式更改实现要求,
并由新的规范
定义修订后的实现要求级别。
7.4.1. 注册模板
"kty" 参数值:
请求的名称(例如,"EC")。由于本
规范的一个核心目标是使生成的表示形式保持紧凑,
因此推荐使用较短的名称——除非有充分理由,
否则不超过 8 个
字符。该名称区分大小写。除非指定专家指出
有充分理由允许例外,否则名称不得以
不区分大小写的方式与其他已注册名称匹配。
密钥类型描述:
密钥类型的简要描述(例如,“椭圆曲线”)。
变更控制者:
对于标准轨道 RFC,列出 "IESG"。对于其他情况,给出
负责方的名称。也可以包含其他详细信息(例如,邮政地址、
电子邮件地址、主页 URI)。
Jones 标准轨道 [第 44 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
JOSE 实现要求:
JWS 和 JWE 的密钥类型实现要求,必须是
“必需”、“推荐”、“可选”、“已弃用”
或“禁止”之一。可选地,该词后面可以跟随 "+"
或 "-"。“+”表示该要求的强度
很可能会在规范的未来版本中提高。
“-”表示该要求的强度很可能
会在规范的未来版本中降低。
规范文档:
对指定该参数的一个或多个文档的引用,
最好包括可用于获取这些文档副本的 URI。
也可以包含相关章节的指示,但这不是
必需的。
7.4.2. 初始注册表内容
本节注册第 6.1 节中定义的值。
o "kty" 参数值:"EC"
o 密钥类型描述:椭圆曲线
o JOSE 实现要求:推荐+
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2 节
o "kty" 参数值:"RSA"
o 密钥类型描述:RSA
o JOSE 实现要求:必需
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3 节
o "kty" 参数值:"oct"
o 密钥类型描述:八位字节序列
o JOSE 实现要求:必需
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.4 节
7.5. JSON Web 密钥参数注册
本节将在本规范第 6.2、
6.3 和 6.4 节中定义的参数名称注册到由 [JWK] 建立的 IANA“JSON Web 密钥
参数”注册表中。
Jones 标准轨道 [第 45 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
7.5.1. 注册表内容
o 参数名称:"crv"
o 参数描述:曲线
o 与 "kty" 值一起使用:"EC"
o 参数信息类别:公开
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.1 节
o 参数名称:"x"
o 参数描述:X 坐标
o 与 "kty" 值一起使用:"EC"
o 参数信息类别:公开
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.2 节
o 参数名称:"y"
o 参数描述:Y 坐标
o 与 "kty" 值一起使用:"EC"
o 参数信息类别:公开
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.3 节
o 参数名称:"d"
o 参数描述:ECC 私钥
o 与 "kty" 值一起使用:"EC"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.2.1 节
o 参数名称:"n"
o 参数描述:模数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:公开
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.1.1 节
o 参数名称:"e"
o 参数描述:指数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:公开
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.1.2 节
Jones 标准轨道 [第 46 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 参数名称:"d"
o 参数描述:私有指数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.1 节
o 参数名称:"p"
o 参数描述:第一素因子
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.2 节
o 参数名称:"q"
o 参数描述:第二素因子
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.3 节
o 参数名称:"dp"
o 参数描述:第一因子 CRT 指数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.4 节
o 参数名称:"dq"
o 参数描述:第二因子 CRT 指数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.5 节
o 参数名称:"qi"
o 参数描述:第一 CRT 系数
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.6 节
Jones 标准轨道 [第 47 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
o 参数名称:"oth"
o 参数描述:其他素数信息
o 与 "kty" 值一起使用:"RSA"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.3.2.7 节
o 参数名称:"k"
o 参数描述:密钥值
o 与 "kty" 值一起使用:"oct"
o 参数信息类别:私有
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.4.1 节
7.6. JSON Web 密钥椭圆曲线注册表
本节为 JWK "crv" 成员值建立 IANA“JSON Web 密钥椭圆曲线”
注册表。该注册表记录曲线
名称、实现要求以及对
定义该曲线的规范的引用。本规范注册
第 6.2.1.1 节中定义的参数名称。
随着密码学环境的发展,曲线的实现要求可能会随时间
改变,例如,将曲线的状态更改为“已弃用”,或者将曲线的状态
从“可选”更改为“推荐+”或“必需”。只有在
指定专家审查后,才能按照“需要规范”的方式更改实现
要求,并由新的规范
定义修订后的实现要求级别。
7.6.1. 注册模板
曲线名称:
请求的名称(例如,"P-256")。由于本
规范的一个核心目标是使生成的表示形式保持紧凑,
因此推荐使用较短的名称——除非有充分理由,
否则不超过 8 个
字符。该名称区分大小写。除非指定专家指出
有充分理由允许例外,否则名称不得以
不区分大小写的方式与其他已注册名称匹配。
曲线描述:
曲线的简要描述(例如,“P-256 曲线”)。
JOSE 实现要求:
JWS 和 JWE 的曲线实现要求,必须
是“必需”、“推荐”、“可选”、“已弃用”或
“禁止”之一。可选地,该词后面可以跟随 "+" 或 "-"。
Jones 标准轨道 [第 48 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
“+”表示该要求的强度很可能
会在规范的未来版本中提高。“-”
表示该要求的强度很可能会在规范的未来版本中
降低。
变更控制者:
对于标准轨道 RFC,列出 "IESG"。对于其他情况,给出
负责方的名称。也可以包含其他详细信息(例如,邮政地址、
电子邮件地址、主页 URI)。
规范文档:
对指定该参数的一个或多个文档的引用,
最好包括可用于获取这些文档副本的 URI。
也可以包含相关章节的指示,但这不是
必需的。
7.6.2. 初始注册表内容
o 曲线名称:"P-256"
o 曲线描述:P-256 曲线
o JOSE 实现要求:推荐+
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.1 节
o 曲线名称:"P-384"
o 曲线描述:P-384 曲线
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.1 节
o 曲线名称:"P-521"
o 曲线描述:P-521 曲线
o JOSE 实现要求:可选
o 变更控制者:IESG
o 规范文档:RFC 7518 第 6.2.1.1 节
8. 安全注意事项
与任何密码应用有关的所有安全问题都必须由
JWS/JWE/JWK 代理处理。这些
问题包括保护用户的非对称私钥和对称
秘密密钥,以及采用针对各种攻击的对策。
[AES]、[DSS]、[JWE]、[JWK]、[JWS]、
[NIST.800-38D]、[NIST.800-56A]、[NIST.800-107]、[RFC2104]、[RFC3394]、
[RFC3447]、[RFC5116]、[RFC6090] 和 [SHS] 中的安全注意事项适用于本
规范。
Jones 标准轨道 [第 49 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
8.1. 密码敏捷性
实现者应该意识到,密码算法会
随时间推移而变弱。随着新的密码分析技术被开发出来以及
计算性能提高,破解特定
密码算法所需的工作量将会降低。因此,实现者和
部署必须准备好让所支持和使用的算法集合
随时间发生变化。因此,密码
算法实现应该采用模块化设计,以便能够轻松加入新算法。
8.2. 密钥生命周期
许多算法都有与
密钥生命周期和/或密钥可使用次数相关的安全注意事项。
当这些算法与 JOSE 数据结构一起使用时,这些安全注意事项
仍然适用。有关密钥生命周期的具体指导,请参阅 NIST SP 800-57
[NIST.800-57]。
8.3. RSAES-PKCS1-v1_5 安全注意事项
尽管 RFC 3447 第 8 节 [RFC3447] 明确要求人们
不要在新应用中采用 RSASSA-PKCS1-v1_5,而应
迁移到 RSASSA-PSS,但出于互操作性原因,本规范确实包含
RSASSA-PKCS1-v1_5,因为它已被
广泛实现。
与 RSAES-PKCS1-v1_5 一起使用的密钥必须遵循
RFC 3447 第 7.2 节中的约束。此外,不得使用
“对 RSA 密码系统的二十年攻击”[Boneh99] 第 3 节中所述的
低公钥指数值密钥。
8.4. AES GCM 安全注意事项
与 AES GCM 一起使用的密钥必须遵循
[NIST.800-38D] 第 8.3 节中的约束,其中指出:“认证加密函数的
总调用次数不得超过 2^32,包括
所有 IV 长度以及使用给定密钥的认证加密
函数的所有实例”。按照此规则,使用
同一密钥值时,AES GCM 的使用次数不得超过 2^32 次。
同一个 IV 值绝不能与同一个 AES
GCM 密钥多次使用。一种防止这种情况的方法是将计数器与密钥一起存储,
并在每次使用时递增该计数器。该计数器也可用于
防止超过上述 2^32 限制。
此安全注意事项不适用于组合的 AES-CBC
HMAC SHA-2 或 AES Key Wrap 算法。
Jones 标准轨道 [第 50 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
8.5. 不安全 JWS 的安全注意事项
不安全 JWS(使用 "alg" 值 "none" 的 JWS)不提供
完整性保护。因此,它们只能用于
载荷通过数字签名
或 MAC 值以外的方式受到保护,或者无需保护的上下文中。
一种防止默认接受不安全 JWS 的示例方法是,
假想的 JWS 软件库的 "verify" 方法具有
一个布尔值 "acceptUnsecured" 参数,用来指示 "none" 是
可接受的 "alg" 值。另一个例子是,"verify" 方法
可以接受应用程序可接受的算法列表
作为参数,并且如果
"none" 不在该列表中,则拒绝不安全 JWS 值。
以下示例说明了不应在全局级别接受
不安全 JWS 的原因。假设某应用程序通过两个通道接受
JWS:(1)HTTP,以及(2)带客户端
认证的 HTTPS。它要求通过
HTTP 接收的对象具有 JWS 签名,但通过 HTTPS 接受不安全 JWS。如果应用程序
在全局范围表示接受 "none",那么攻击者
可以通过 HTTP 向其提供不安全 JWS,而该
对象仍能成功通过验证。相反,应用程序需要
针对通过 HTTPS 接收的每个对象表示接受 "none"
(例如,将上述第一个
假想 JWS 软件库中的 "acceptUnsecured" 设置为 "true"),但不能对
通过 HTTP 接收的每个对象这样做。
8.6. 拒绝服务攻击
验证签名的接收代理和
加密消息的发送代理在使用大于本规范规定大小的密钥
验证签名和加密消息时,需要注意密码处理
资源的使用。攻击者可能会
提供使用会导致过量
密码处理的密钥的内容,例如,使用大于
本规范规定大小的密钥。实现应该设置并
强制执行其接受的密钥大小上限。NIST SP 800-57 [NIST.800-57] 的 第 5.6.1 节
(可比算法强度)
包含有关最大批准密钥大小的说明,这些说明可能
适用。
8.7. 加密密钥时重用密钥材料
不推荐重用同一完整的密钥材料集合
(密钥加密密钥、内容加密密钥、初始化向量
等)来加密多个 JWK 或 JWK 集对象,或者多次加密
同一个 JWK 或 JWK 集对象。一项防止
Jones 标准轨道 [第 51 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
重用的建议是,为每次加密操作始终生成至少一个新的密钥
材料(例如,新的内容
加密密钥、新的 IV 和/或新的 PBES2 盐),依据
本文档中指出的注意事项以及 RFC 4086
[RFC4086] 中的注意事项。
8.8. 密码注意事项
密码容易受到多种攻击。为了帮助缓解
其中一些限制,本文档应用 RFC
2898 [RFC2898] 中的原则,从用户提供的
密码派生密码密钥。
然而,密码的强度仍然具有显著影响。
高熵密码对字典攻击具有更强的抵抗力。
[NIST.800-63-2] 包含估算密码熵的指导原则,
可以帮助应用程序和用户生成更强的密码。
理想密码的长度应与
派生密钥长度相同(或更长)。但是,大于某个
算法特定大小的密码会首先经过散列,这会将攻击者的
有效搜索空间缩小到散列算法的长度。推荐
用于 "PBES2-HS256+A128KW" 的密码不少于
16 个八位字节且不超过 128 个八位字节,而用于
"PBES2-HS512+A256KW" 的密码不少于 32 个八位字节且不超过
128 个八位字节。
尽管如此,仍需谨慎考虑在哪里以及如何使用基于密码的
加密。如果迭代次数太小,这些算法仍可能受到
基于字典的攻击;如果这些算法用于保护
攻击者可以无限次尝试绕过
保护的数据,例如存储在文件系统上的受保护数据,则尤其需要
关注这一点。
8.9. 密钥熵和随机值
有关密钥熵
和随机值的安全注意事项,请参阅 [JWS] 第 10.1 节。
8.10. 数字签名与 MAC 之间的差异
有关数字签名和 MAC 之间差异的安全注意事项,
请参阅 [JWS] 第 10.5 节。
Jones 标准轨道 [第 52 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
8.11. 使用匹配的算法强度
有关使用
匹配算法强度的安全注意事项,请参阅 [JWE] 第 11.3 节。
8.12. 自适应选择密文攻击
有关自适应
选择密文攻击的安全注意事项,请参阅 [JWE] 第 11.4 节。
8.13. 时序攻击
有关时序攻击的安全
注意事项,请参阅 [JWS] 第 10.9 节和 [JWE] 第 11.5 节。
8.14. RSA 私钥表示和盲化
有关 RSA 私钥
表示和盲化的安全注意事项,请参阅 [JWK] 第 9.3 节。
9. 国际化注意事项
从用户获取的密码可能需要进行准备和
规范化,以处理不同输入设备、
区域设置等产生的八位字节序列之间的差异。推荐
应用程序在执行密钥派生
和加密之前,按照 [PRECIS] 中概述的步骤处理
用户直接提供的密码。
10. 参考文献
10.1. 规范性参考文献
[AES] 美国国家标准与技术研究院(NIST),
“高级加密标准(AES)”,FIPS PUB 197,
2001 年 11 月,<http://csrc.nist.gov/publications/
fips/fips197/fips-197.pdf>.
[Boneh99] “对 RSA 密码系统的二十年攻击”,《美国
数学学会(AMS)通告》,第 46 卷,
第 2 期,第 203-213 页,1999 年,<http://crypto.stanford.edu/
~dabo/pubs/papers/RSA-survey.pdf>.
Jones 标准轨道 [第 53 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
[DSS] 美国国家标准与技术研究院(NIST),
“数字签名标准(DSS)”,FIPS PUB 186-4,2013 年 7 月,
<http://nvlpubs.nist.gov/nistpubs/FIPS/
NIST.FIPS.186-4.pdf>.
[JWE] Jones, M. 和 J. Hildebrand,“JSON Web 加密(JWE)”,
RFC 7516,DOI 10.17487/RFC7516,2015 年 5 月,
<http://www.rfc-editor.org/info/rfc7516>.
[JWK] Jones, M.,“JSON Web 密钥(JWK)”,RFC 7517,
DOI 10.17487/RFC7517,2015 年 5 月,
<http://www.rfc-editor.org/info/rfc7517>.
[JWS] Jones, M., Bradley, J. 和 N. Sakimura,“JSON Web
签名(JWS)”,RFC 7515,DOI 10.17487/RFC7515,2015 年 5 月,
<http://www.rfc-editor.org/info/rfc7515>.
[NIST.800-38A]
美国国家标准与技术研究院(NIST),
“分组密码操作模式建议”,NIST
特别出版物 800-38A,2001 年 12 月,
<http://csrc.nist.gov/publications/nistpubs/800-38a/
sp800-38a.pdf>.
[NIST.800-38D]
美国国家标准与技术研究院(NIST),
“分组密码操作模式建议:
伽罗瓦/计数器模式(GCM)和 GMAC”,NIST 特别
出版物 800-38D,2001 年 12 月,
<http://csrc.nist.gov/publications/nistpubs/800-38D/
SP-800-38D.pdf>.
[NIST.800-56A]
美国国家标准与技术研究院(NIST),
“使用离散对数密码学的成对密钥建立方案
建议”,NIST 特别
出版物 800-56A,第 2 次修订,2013 年 5 月,
<http://nvlpubs.nist.gov/nistpubs/SpecialPublications/
NIST.SP.800-56Ar2.pdf>.
[NIST.800-57]
美国国家标准与技术研究院(NIST),
“密钥管理建议——第 1 部分:通用
(第 3 次修订)”,NIST 特别出版物 800-57,第 1 部分,
第 3 次修订,2012 年 7 月,<http://csrc.nist.gov/publications/
nistpubs/800-57/sp800-57_part1_rev3_general.pdf>.
Jones 标准轨道 [第 54 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
[RFC20] Cerf, V.,“用于网络交换的 ASCII 格式”,STD 80,
RFC 20,DOI 10.17487/RFC0020,1969 年 10 月,
<http://www.rfc-editor.org/info/rfc20>.
[RFC2104] Krawczyk, H., Bellare, M. 和 R. Canetti,“HMAC:
用于消息认证的密钥散列”,RFC 2104,
DOI 10.17487/RFC2104,1997 年 2 月,
<http://www.rfc-editor.org/info/rfc2104>.
[RFC2119] Bradner, S.,“用于 RFC 中表示
要求级别的关键词”,BCP 14,RFC 2119,
DOI 10.17487/RFC2119,1997 年 3 月,
<http://www.rfc-editor.org/info/rfc2119>.
[RFC2898] Kaliski, B.,“PKCS #5:基于密码的密码学
规范 2.0 版”,RFC 2898,
DOI 10.17487/RFC2898,2000 年 9 月,
<http://www.rfc-editor.org/info/rfc2898>.
[RFC3394] Schaad, J. 和 R. Housley,“高级加密标准
(AES)密钥包装算法”,RFC 3394,DOI 10.17487/RFC3394,
2002 年 9 月,<http://www.rfc-editor.org/info/rfc3394>.
[RFC3447] Jonsson, J. 和 B. Kaliski,“公钥密码
标准(PKCS)#1:RSA 密码规范
2.1 版”,RFC 3447,DOI 10.17487/RFC3447,2003 年 2 月,
<http://www.rfc-editor.org/info/rfc3447>.
[RFC3629] Yergeau, F.,“UTF-8,ISO
10646 的一种转换格式”,STD 63,RFC 3629,DOI 10.17487/RFC3629,2003 年 11 月,
<http://www.rfc-editor.org/info/rfc3629>.
[RFC4868] Kelly, S. 和 S. Frankel,“在 IPsec 中使用 HMAC-SHA-256、
HMAC-SHA-384 和 HMAC-SHA-512”,RFC 4868,
DOI 10.17487/RFC4868,2007 年 5 月,
<http://www.rfc-editor.org/info/rfc4868>.
[RFC4949] Shirey, R.,“互联网安全术语表,第 2 版”,
FYI 36,RFC 4949,DOI 10.17487/RFC4949,2007 年 8 月,
<http://www.rfc-editor.org/info/rfc4949>.
[RFC5652] Housley, R.,“密码消息语法(CMS)”,STD 70,
RFC 5652,DOI 10.17487/RFC5652,2009 年 9 月,
<http://www.rfc-editor.org/info/rfc5652>.
Jones 标准轨道 [第 55 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
[RFC6090] McGrew, D., Igoe, K. 和 M. Salter,“基础椭圆曲线
密码算法”,RFC 6090,
DOI 10.17487/RFC6090,2011 年 2 月,
<http://www.rfc-editor.org/info/rfc6090>.
[RFC7159] Bray, T., Ed.,“JavaScript 对象表示法(JSON)数据
交换格式”,RFC 7159,DOI 10.17487/RFC7159,2014 年 3 月,
<http://www.rfc-editor.org/info/rfc7159>.
[SEC1] 高效密码学标准组,“SEC 1:
椭圆曲线密码学”,2.0 版,2009 年 5 月,
<http://www.secg.org/sec1-v2.pdf>.
[SHS] 美国国家标准与技术研究院(NIST),
“安全散列标准(SHS)”,FIPS PUB 180-4,2012 年 3 月,
<http://csrc.nist.gov/publications/fips/fips180-4/
fips-180-4.pdf>.
[UNICODE] Unicode 联盟,“Unicode 标准”,
<http://www.unicode.org/versions/latest/>.
10.2. 资料性参考文献
[AEAD-CBC-SHA]
McGrew, D., Foley, J. 和 K. Paterson,“使用 AES-CBC 和 HMAC-SHA 的认证
加密”,进行中的工作,
draft-mcgrew-aead-aes-cbc-hmac-sha2-05,2014 年 7 月。
[CanvasApp]
Facebook,“Canvas 应用程序”,2010 年,
<http://developers.facebook.com/docs/authentication/
canvas>.
[JCA] Oracle,“Java 密码体系结构(JCA)参考
指南”,2014 年,<http://docs.oracle.com/javase/8/docs/techno
tes/guides/security/crypto/CryptoSpec.html>.
[JSE] Bradley, J. 和 N. Sakimura(编辑),“JSON 简单
加密”,2010 年 9 月,
<http://jsonenc.info/enc/1.0/>.
[JSMS] Rescorla, E. 和 J. Hildebrand,“JavaScript 消息
安全格式”,进行中的工作,
draft-rescorla-jsms-00,2011 年 3 月。
[JSS] Bradley, J. 和 N. Sakimura, Ed.,“JSON 简单签名 1.0”,
草案 01,2010 年 9 月,<http://jsonenc.info/jss/1.0/>.
Jones 标准轨道 [第 56 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
[JWE-JWK] Miller, M.,“使用 JavaScript 对象表示法(JSON)Web
加密(JWE)保护 JSON Web 密钥(JWK)
对象”,进行中的工作,
draft-miller-jose-jwe-protected-jwk-02,2013 年 6 月。
[MagicSignatures]
Panzer, J., Ed., Laurie, B. 和 D. Balfanz,“Magic
Signatures”,2011 年 1 月,
<http://salmon-protocol.googlecode.com/svn/trunk/
draft-panzer-magicsig-01.html>.
[NIST.800-107]
美国国家标准与技术研究院(NIST),
“使用批准散列
算法的应用建议”,NIST 特别出版物 800-107,第 1 次修订,
2012 年 8 月,<http://csrc.nist.gov/publications/
nistpubs/800-107-rev1/sp800-107-rev1.pdf>.
[NIST.800-63-2]
美国国家标准与技术研究院(NIST),
“电子认证指南”,NIST 特别
出版物 800-63-2,2013 年 8 月,
<http://nvlpubs.nist.gov/nistpubs/SpecialPublications/
NIST.SP.800-63-2.pdf>.
[PRECIS] Saint-Andre, P. 和 A. Melnikov,“表示用户名和密码的国际化字符串的准备、
执行和比较”,进行中的工作,
draft-ietf-precis-saslprepbis-16,2015 年 4 月。
[RFC2631] Rescorla, E.,“Diffie-Hellman 密钥协商方法”,
RFC 2631,DOI 10.17487/RFC2631,1999 年 6 月,
<http://www.rfc-editor.org/info/rfc2631>.
[RFC3275] Eastlake 3rd, D., Reagle, J. 和 D. Solo,“(可扩展
标记语言)XML 签名语法和处理”,
RFC 3275,DOI 10.17487/RFC3275,2002 年 3 月,
<http://www.rfc-editor.org/info/rfc3275>.
[RFC4086] Eastlake 3rd, D., Schiller, J. 和 S. Crocker,
“安全性的随机性要求”,BCP 106,RFC 4086,
DOI 10.17487/RFC4086,2005 年 6 月,
<http://www.rfc-editor.org/info/rfc4086>.
[RFC5116] McGrew, D.,“认证加密的接口和算法”,
RFC 5116,DOI 10.17487/RFC5116,2008 年 1 月,
<http://www.rfc-editor.org/info/rfc5116>.
Jones 标准轨道 [第 57 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
[RFC5226] Narten, T. 和 H. Alvestrand,“在 RFC 中编写
IANA 注意事项章节的指南”,BCP 26,RFC 5226,
DOI 10.17487/RFC5226,2008 年 5 月,
<http://www.rfc-editor.org/info/rfc5226>.
[W3C.NOTE-xmldsig-core2-20130411]
Eastlake, D., Reagle, J., Solo, D., Hirsch, F., Roessler,
T., Yiu, K., Datta, P. 和 S. Cantor,“XML 签名
语法和处理 2.0 版”,万维网
联盟注释 NOTE-xmldsig-core2-20130411,2013 年 4 月,
<http://www.w3.org/TR/2013/NOTE-xmldsig-core2-20130411/>.
[W3C.REC-xmlenc-core-20021210]
Eastlake, D. 和 J. Reagle,“XML 加密语法和
处理”,万维网联盟推荐标准 REC-
xmlenc-core-20021210,2002 年 12 月,
<http://www.w3.org/TR/2002/REC-xmlenc-core-20021210>.
[W3C.REC-xmlenc-core1-20130411]
Eastlake, D., Reagle, J., Hirsch, F. 和 T. Roessler,
“XML 加密语法和处理 1.1 版”,万维网
联盟推荐标准 REC-xmlenc-
core1-20130411,2013 年 4 月,
<http://www.w3.org/TR/2013/REC-xmlenc-core1-20130411/>.
Jones 标准轨道 [第 58 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
附录 A. 算法标识符交叉引用
本附录包含一些表格,用于将本规范中定义的密码
算法标识符值与其他标准和软件包
使用的等效标识符进行交叉引用。
有关这些文档定义的名称的更多信息,请参阅 XML DSIG [RFC3275]、XML DSIG 2.0
[W3C.NOTE-xmldsig-core2-20130411]、XML 加密
[W3C.REC-xmlenc-core-20021210]、XML 加密 1.1
[W3C.REC-xmlenc-core1-20130411] 和 Java 密码体系结构
[JCA]。
Jones 标准轨道 [第 59 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
A.1. 数字签名/MAC 算法标识符交叉引用
本节包含一个表格,用于将本
规范中定义的 JWS 数字签名和 MAC "alg"(算法)值
与其他标准和软件包使用的等效标识符
进行交叉引用。
+-------------------------------------------------------------------+
| JWS | XML DSIG |
| | JCA | OID |
+-------------------------------------------------------------------+
| HS256 | http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 |
| | HmacSHA256 | 1.2.840.113549.2.9 |
+-------------------------------------------------------------------+
| HS384 | http://www.w3.org/2001/04/xmldsig-more#hmac-sha384 |
| | HmacSHA384 | 1.2.840.113549.2.10 |
+-------------------------------------------------------------------+
| HS512 | http://www.w3.org/2001/04/xmldsig-more#hmac-sha512 |
| | HmacSHA512 | 1.2.840.113549.2.11 |
+-------------------------------------------------------------------+
| RS256 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 |
| | SHA256withRSA | 1.2.840.113549.1.1.11 |
+-------------------------------------------------------------------+
| RS384 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha384 |
| | SHA384withRSA | 1.2.840.113549.1.1.12 |
+-------------------------------------------------------------------+
| RS512 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 |
| | SHA512withRSA | 1.2.840.113549.1.1.13 |
+-------------------------------------------------------------------+
| ES256 | http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 |
| | SHA256withECDSA | 1.2.840.10045.4.3.2 |
+-------------------------------------------------------------------+
| ES384 | http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384 |
| | SHA384withECDSA | 1.2.840.10045.4.3.3 |
+-------------------------------------------------------------------+
| ES512 | http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512 |
| | SHA512withECDSA | 1.2.840.10045.4.3.4 |
+-------------------------------------------------------------------+
| PS256 | http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1 |
| | SHA256withRSAandMGF1 | 1.2.840.113549.1.1.10 |
+-------------------------------------------------------------------+
| PS384 | http://www.w3.org/2007/05/xmldsig-more#sha384-rsa-MGF1 |
| | SHA384withRSAandMGF1 | 1.2.840.113549.1.1.10 |
+-------------------------------------------------------------------+
| PS512 | http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1 |
| | SHA512withRSAandMGF1 | 1.2.840.113549.1.1.10 |
+-------------------------------------------------------------------+
Jones 标准轨道 [第 60 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
A.2. 密钥管理算法标识符交叉引用
本节包含一个表格,用于将本规范中定义的 JWE "alg"
(算法)值与其他标准和软件包使用的等效
标识符进行交叉引用。
+-------------------------------------------------------------------+
| JWE | XML ENC |
| | JCA | OID |
+-------------------------------------------------------------------+
| RSA1_5 | http://www.w3.org/2001/04/xmlenc#rsa-1_5 |
| | RSA/ECB/PKCS1Padding | 1.2.840.113549.1.1.1 |
+-------------------------------------------------------------------+
| RSA-OAEP | http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p |
| | RSA/ECB/OAEPWithSHA-1AndMGF1Padding | 1.2.840.113549.1.1.7 |
+-------------------------------------------------------------------+
| RSA-OAEP-256 | http://www.w3.org/2009/xmlenc11#rsa-oaep |
| | & http://www.w3.org/2009/xmlenc11#mgf1sha256 |
| | RSA/ECB/OAEPWithSHA-256AndMGF1Padding | |
| | & MGF1ParameterSpec.SHA256 | 1.2.840.113549.1.1.7 |
+-------------------------------------------------------------------+
| ECDH-ES | http://www.w3.org/2009/xmlenc11#ECDH-ES |
| | ECDH | 1.3.132.1.12 |
+-------------------------------------------------------------------+
| A128KW | http://www.w3.org/2001/04/xmlenc#kw-aes128 |
| | AESWrap | 2.16.840.1.101.3.4.1.5 |
+-------------------------------------------------------------------+
| A192KW | http://www.w3.org/2001/04/xmlenc#kw-aes192 |
| | AESWrap | 2.16.840.1.101.3.4.1.25 |
+-------------------------------------------------------------------+
| A256KW | http://www.w3.org/2001/04/xmlenc#kw-aes256 |
| | AESWrap | 2.16.840.1.101.3.4.1.45 |
+-------------------------------------------------------------------+
Jones 标准轨道 [第 61 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
A.3. 内容加密算法标识符交叉引用
本节包含一个表格,用于将本规范中定义的 JWE "enc"
(加密算法)值与其他标准和软件包使用的
等效标识符进行交叉引用。
对于组合算法 "A128CBC-HS256"、"A192CBC-HS384" 和
"A256CBC-HS512",列出了相应的 AES-CBC 算法标识符。
+-------------------------------------------------------------------+
| JWE | XML ENC |
| | JCA | OID |
+-------------------------------------------------------------------+
| A128CBC-HS256 | http://www.w3.org/2001/04/xmlenc#aes128-cbc |
| | AES/CBC/PKCS5Padding | 2.16.840.1.101.3.4.1.2 |
+-------------------------------------------------------------------+
| A192CBC-HS384 | http://www.w3.org/2001/04/xmlenc#aes192-cbc |
| | AES/CBC/PKCS5Padding | 2.16.840.1.101.3.4.1.22 |
+-------------------------------------------------------------------+
| A256CBC-HS512 | http://www.w3.org/2001/04/xmlenc#aes256-cbc |
| | AES/CBC/PKCS5Padding | 2.16.840.1.101.3.4.1.42 |
+-------------------------------------------------------------------+
| A128GCM | http://www.w3.org/2009/xmlenc11#aes128-gcm |
| | AES/GCM/NoPadding | 2.16.840.1.101.3.4.1.6 |
+-------------------------------------------------------------------+
| A192GCM | http://www.w3.org/2009/xmlenc11#aes192-gcm |
| | AES/GCM/NoPadding | 2.16.840.1.101.3.4.1.26 |
+-------------------------------------------------------------------+
| A256GCM | http://www.w3.org/2009/xmlenc11#aes256-gcm |
| | AES/GCM/NoPadding | 2.16.840.1.101.3.4.1.46 |
+-------------------------------------------------------------------+
附录 B. AES_CBC_HMAC_SHA2 算法的测试用例
以下测试用例可用于验证
第 5.2 节中定义的 AES_CBC_HMAC_SHA2 算法实现。它们还
旨在对应 [AEAD-CBC-SHA] 未来版本中可能出现的测试用例,
以证明所执行的密码
计算是相同的。
变量名称与第 5.2 节中定义的相同。所有值均为
十六进制。
Jones 标准轨道 [第 62 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
B.1. AES_128_CBC_HMAC_SHA_256 的测试用例
AES_128_CBC_HMAC_SHA_256
K = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
MAC_KEY = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
ENC_KEY = 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
P = 41 20 63 69 70 68 65 72 20 73 79 73 74 65 6d 20
6d 75 73 74 20 6e 6f 74 20 62 65 20 72 65 71 75
69 72 65 64 20 74 6f 20 62 65 20 73 65 63 72 65
74 2c 20 61 6e 64 20 69 74 20 6d 75 73 74 20 62
65 20 61 62 6c 65 20 74 6f 20 66 61 6c 6c 20 69
6e 74 6f 20 74 68 65 20 68 61 6e 64 73 20 6f 66
20 74 68 65 20 65 6e 65 6d 79 20 77 69 74 68 6f
75 74 20 69 6e 63 6f 6e 76 65 6e 69 65 6e 63 65
IV = 1a f3 8c 2d c2 b9 6f fd d8 66 94 09 23 41 bc 04
A = 54 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6e 63
69 70 6c 65 20 6f 66 20 41 75 67 75 73 74 65 20
4b 65 72 63 6b 68 6f 66 66 73
AL = 00 00 00 00 00 00 01 50
E = c8 0e df a3 2d df 39 d5 ef 00 c0 b4 68 83 42 79
a2 e4 6a 1b 80 49 f7 92 f7 6b fe 54 b9 03 a9 c9
a9 4a c9 b4 7a d2 65 5c 5f 10 f9 ae f7 14 27 e2
fc 6f 9b 3f 39 9a 22 14 89 f1 63 62 c7 03 23 36
09 d4 5a c6 98 64 e3 32 1c f8 29 35 ac 40 96 c8
6e 13 33 14 c5 40 19 e8 ca 79 80 df a4 b9 cf 1b
38 4c 48 6f 3a 54 c5 10 78 15 8e e5 d7 9d e5 9f
bd 34 d8 48 b3 d6 95 50 a6 76 46 34 44 27 ad e5
4b 88 51 ff b5 98 f7 f8 00 74 b9 47 3c 82 e2 db
M = 65 2c 3f a3 6b 0a 7c 5b 32 19 fa b3 a3 0b c1 c4
e6 e5 45 82 47 65 15 f0 ad 9f 75 a2 b7 1c 73 ef
T = 65 2c 3f a3 6b 0a 7c 5b 32 19 fa b3 a3 0b c1 c4
Jones 标准轨道 [第 63 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
B.2. AES_192_CBC_HMAC_SHA_384 的测试用例
K = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
MAC_KEY = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17
ENC_KEY = 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27
28 29 2a 2b 2c 2d 2e 2f
P = 41 20 63 69 70 68 65 72 20 73 79 73 74 65 6d 20
6d 75 73 74 20 6e 6f 74 20 62 65 20 72 65 71 75
69 72 65 64 20 74 6f 20 62 65 20 73 65 63 72 65
74 2c 20 61 6e 64 20 69 74 20 6d 75 73 74 20 62
65 20 61 62 6c 65 20 74 6f 20 66 61 6c 6c 20 69
6e 74 6f 20 74 68 65 20 68 61 6e 64 73 20 6f 66
20 74 68 65 20 65 6e 65 6d 79 20 77 69 74 68 6f
75 74 20 69 6e 63 6f 6e 76 65 6e 69 65 6e 63 65
IV = 1a f3 8c 2d c2 b9 6f fd d8 66 94 09 23 41 bc 04
A = 54 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6e 63
69 70 6c 65 20 6f 66 20 41 75 67 75 73 74 65 20
4b 65 72 63 6b 68 6f 66 66 73
AL = 00 00 00 00 00 00 01 50
E = ea 65 da 6b 59 e6 1e db 41 9b e6 2d 19 71 2a e5
d3 03 ee b5 00 52 d0 df d6 69 7f 77 22 4c 8e db
00 0d 27 9b dc 14 c1 07 26 54 bd 30 94 42 30 c6
57 be d4 ca 0c 9f 4a 84 66 f2 2b 22 6d 17 46 21
4b f8 cf c2 40 0a dd 9f 51 26 e4 79 66 3f c9 0b
3b ed 78 7a 2f 0f fc bf 39 04 be 2a 64 1d 5c 21
05 bf e5 91 ba e2 3b 1d 74 49 e5 32 ee f6 0a 9a
c8 bb 6c 6b 01 d3 5d 49 78 7b cd 57 ef 48 49 27
f2 80 ad c9 1a c0 c4 e7 9c 7b 11 ef c6 00 54 e3
M = 84 90 ac 0e 58 94 9b fe 51 87 5d 73 3f 93 ac 20
75 16 80 39 cc c7 33 d7 45 94 f8 86 b3 fa af d4
86 f2 5c 71 31 e3 28 1e 36 c7 a2 d1 30 af de 57
T = 84 90 ac 0e 58 94 9b fe 51 87 5d 73 3f 93 ac 20
75 16 80 39 cc c7 33 d7
Jones 标准轨道 [第 64 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
B.3. AES_256_CBC_HMAC_SHA_512 的测试用例
K = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
MAC_KEY = 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
ENC_KEY = 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
P = 41 20 63 69 70 68 65 72 20 73 79 73 74 65 6d 20
6d 75 73 74 20 6e 6f 74 20 62 65 20 72 65 71 75
69 72 65 64 20 74 6f 20 62 65 20 73 65 63 72 65
74 2c 20 61 6e 64 20 69 74 20 6d 75 73 74 20 62
65 20 61 62 6c 65 20 74 6f 20 66 61 6c 6c 20 69
6e 74 6f 20 74 68 65 20 68 61 6e 64 73 20 6f 66
20 74 68 65 20 65 6e 65 6d 79 20 77 69 74 68 6f
75 74 20 69 6e 63 6f 6e 76 65 6e 69 65 6e 63 65
IV = 1a f3 8c 2d c2 b9 6f fd d8 66 94 09 23 41 bc 04
A = 54 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6e 63
69 70 6c 65 20 6f 66 20 41 75 67 75 73 74 65 20
4b 65 72 63 6b 68 6f 66 66 73
AL = 00 00 00 00 00 00 01 50
E = 4a ff aa ad b7 8c 31 c5 da 4b 1b 59 0d 10 ff bd
3d d8 d5 d3 02 42 35 26 91 2d a0 37 ec bc c7 bd
82 2c 30 1d d6 7c 37 3b cc b5 84 ad 3e 92 79 c2
e6 d1 2a 13 74 b7 7f 07 75 53 df 82 94 10 44 6b
36 eb d9 70 66 29 6a e6 42 7e a7 5c 2e 08 46 a1
1a 09 cc f5 37 0d c8 0b fe cb ad 28 c7 3f 09 b3
a3 b7 5e 66 2a 25 94 41 0a e4 96 b2 e2 e6 60 9e
31 e6 e0 2c c8 37 f0 53 d2 1f 37 ff 4f 51 95 0b
be 26 38 d0 9d d7 a4 93 09 30 80 6d 07 03 b1 f6
M = 4d d3 b4 c0 88 a7 f4 5c 21 68 39 64 5b 20 12 bf
2e 62 69 a8 c5 6a 81 6d bc 1b 26 77 61 95 5b c5
fd 30 a5 65 c6 16 ff b2 f3 64 ba ec e6 8f c4 07
53 bc fc 02 5d de 36 93 75 4a a1 f5 c3 37 3b 9c
T = 4d d3 b4 c0 88 a7 f4 5c 21 68 39 64 5b 20 12 bf
2e 62 69 a8 c5 6a 81 6d bc 1b 26 77 61 95 5b c5
Jones 标准轨道 [第 65 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
附录 C. ECDH-ES 密钥协商计算示例
本示例使用 ECDH-ES 密钥协商和 Concat KDF,
按照第 4.6 节所述的方式派生 CEK。在此示例中,
使用 ECDH-ES 直接密钥协商模式("alg" 值 "ECDH-ES")
为使用 128 位密钥的 AES GCM("enc"
值 "A128GCM")生成协商密钥。
在此示例中,生成方 Alice 正在向使用方
Bob 加密内容。生成方(Alice)为密钥
协商计算生成临时密钥。本示例中用于
密钥协商计算的 Alice 临时密钥(JWK 格式,
包括私有部分)为:
{"kty":"EC",
"crv":"P-256",
"x":"gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0",
"y":"SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps",
"d":"0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo"
}
本示例中用于密钥协商
计算的使用方(Bob)的密钥(JWK 格式,包括私有部分)为:
{"kty":"EC",
"crv":"P-256",
"x":"weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ",
"y":"e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck",
"d":"VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw"
}
本示例中使用的头部参数值如下。
"apu"(协商 PartyUInfo)头部参数值是 UTF-8 字符串 "Alice" 的
base64url 编码,"apv"(协商
PartyVInfo)头部参数值是
UTF-8 字符串 "Bob" 的 base64url 编码。"epk"(临时公钥)头部
参数用于将生成方(Alice)的临时
公钥值传达给使用方(Bob)。
Jones 标准轨道 [第 66 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
{"alg":"ECDH-ES",
"enc":"A128GCM",
"apu":"QWxpY2U",
"apv":"Qm9i",
"epk":
{"kty":"EC",
"crv":"P-256",
"x":"gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0",
"y":"SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps"
}
}
得到的 Concat KDF [NIST.800-56A] 参数值如下:
Z
将其设置为 ECDH-ES 密钥协商输出。(由于 NIST 安全
要求,该值通常不会由库直接公开,
而只作为 KDF 的输入。)在本
示例中,Z 是以下八位字节序列(使用 JSON 数组
表示法):
[158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132,
38, 156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121,
140, 254, 144, 196].
keydatalen
此值为 128——即所需输出密钥中的位数
(因为 "A128GCM" 使用 128 位密钥)。
AlgorithmID
将其设置为表示 32 位大端值
7 的八位字节——[0, 0, 0, 7]——即 AlgorithmID 内容
"A128GCM" 中的八位字节数,随后是表示 ASCII 字符串
"A128GCM" 的八位字节——[65, 49, 50, 56, 71, 67, 77]。
PartyUInfo
将其设置为表示 32 位大端值
5 的八位字节——[0, 0, 0, 5]——即 PartyUInfo 内容
"Alice" 中的八位字节数,随后是表示 UTF-8 字符串
"Alice" 的八位字节——[65, 108, 105, 99, 101]。
PartyVInfo
将其设置为表示 32 位大端值
3 的八位字节——[0, 0, 0, 3]——即 PartyUInfo 内容
"Bob" 中的八位字节数,随后是表示 UTF-8 字符串 "Bob"
的八位字节——[66, 111, 98]。
Jones 标准轨道 [第 67 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
SuppPubInfo
将其设置为表示 32 位大端值
128 的八位字节——[0, 0, 0, 128]——即 keydatalen 值。
SuppPrivInfo
将其设置为空八位字节序列。
将 AlgorithmID 到 SuppPubInfo 的参数串联起来,
得到 OtherInfo 值:
[0, 0, 0, 7, 65, 49, 50, 56, 71, 67, 77, 0, 0, 0, 5, 65, 108, 105,
99, 101, 0, 0, 0, 3, 66, 111, 98, 0, 0, 0, 128]
将轮次编号 1([0, 0, 0, 1])、Z 和 OtherInfo
值串联起来,得到 Concat KDF 第 1 轮散列输入:
[0, 0, 0, 1,
158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132, 38,
156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121, 140,
254, 144, 196,
0, 0, 0, 7, 65, 49, 50, 56, 71, 67, 77, 0, 0, 0, 5, 65, 108, 105, 99,
101, 0, 0, 0, 3, 66, 111, 98, 0, 0, 0, 128]
最终得到的派生密钥,即第 1 轮
散列输出的前 128 位,为:
[86, 170, 141, 234, 248, 35, 109, 32, 92, 34, 40, 205, 113, 167, 16,
26]
此派生密钥的 base64url 编码表示为:
VqqN6vgjbSBcIijNcacQGg
Jones 标准轨道 [第 68 页]
RFC 7518 JSON Web 算法(JWA) 2015 年 5 月
致谢
以前已有多种用于签名和加密 JSON 内容的解决方案被探索,
包括“Magic Signatures”[MagicSignatures]、“JSON Simple Sign
1.0”[JSS]、“Canvas 应用程序”[CanvasApp]、“JSON 简单
加密”[JSE] 和“JavaScript 消息安全格式”[JSMS],
它们都对本文档产生了影响。
“使用 AES-CBC 和 HMAC-SHA 的认证加密”
[AEAD-CBC-SHA] 规范是 AES_CBC_HMAC_SHA2
算法的基础,由 David A. McGrew 和 Kenny
Paterson 编写。AES_CBC_HMAC_SHA2 的测试用例基于
John Foley 为 [AEAD-CBC-SHA] 编写的测试用例。
Matt Miller 编写了“使用 JavaScript 对象表示法(JSON)Web
加密(JWE)保护 JSON Web 密钥(JWK)对象”
[JWE-JWK],本文档中基于密码的加密内容
即以此为基础。
本规范是 JOSE 工作组的成果,该工作组
包括数十名积极且投入的参与者。尤其是,
以下人员贡献了思想、反馈和文字表述,
对本规范产生了影响:
Dirk Balfanz, Richard Barnes, Carsten Bormann, John Bradley, Brian
Campbell, Alissa Cooper, Breno de Medeiros, Vladimir Dzhuvinov, Roni
Even, Stephen Farrell, Yaron Y. Goland, Dick Hardt, Joe Hildebrand,
Jeff Hodges, Edmund Jay, Charlie Kaufman, Barry Leiba, James Manger,
Matt Miller, Kathleen Moriarty, Tony Nadalin, Axel Nennker, John
Panzer, Emmanuel Raviart, Eric Rescorla, Pete Resnick, Nat Sakimura,
Jim Schaad, Hannes Tschofenig, and Sean Turner.
Jim Schaad 和 Karen O'Donoghue 担任 JOSE 工作组主席,
Sean Turner、Stephen Farrell 和 Kathleen Moriarty 在本规范
制定期间担任安全领域主任。
作者地址
Michael B. Jones
Microsoft
电子邮件:mbj@microsoft.com
URI: http://self-issued.info/
Jones 标准轨道 [第 69 页]