3. 数字签名和 MAC 的加密算法
JWS 使用加密算法对 JWS Protected Header 和 JWS Payload 的内容进行数字签名, 或为这些内容创建 MAC.
3.1 用于 JWS 的 "alg" (Algorithm) Header Parameter 值
下表定义了本规范为 JWS 定义的 "alg" (algorithm) Header Parameter 值:
| "alg" 参数值 | 数字签名或 MAC 算法 | 实现要求 |
|---|---|---|
| HS256 | HMAC using SHA-256 | Required |
| HS384 | HMAC using SHA-384 | Optional |
| HS512 | HMAC using SHA-512 | Optional |
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 | Recommended |
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 | Optional |
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 | Optional |
| ES256 | ECDSA using P-256 and SHA-256 | Recommended+ |
| ES384 | ECDSA using P-384 and SHA-384 | Optional |
| ES512 | ECDSA using P-521 and SHA-512 | Optional |
| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 | Optional |
| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 | Optional |
| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 | Optional |
| none | No digital signature or MAC performed | Optional |
注: 实现要求列中的 "+" 表示该要求强度在未来版本的规范中可能提高.
3.2 使用 SHA-2 函数的 HMAC
基于哈希的消息认证码 (Hash-based Message Authentication Codes, HMACs) 允许使用一个秘密值加上一个加密哈希函数来生成 MAC. 该算法定义于 RFC 2104 [RFC2104].
密钥要求: 此算法 MUST 使用大小不小于哈希输出大小的密钥, 例如 "HS256" 使用 256 bits 或更大的密钥.
HMAC 算法值:
| "alg" 参数值 | MAC 算法 |
|---|---|
| HS256 | HMAC using SHA-256 |
| HS384 | HMAC using SHA-384 |
| HS512 | HMAC using SHA-512 |
验证要求: HMAC 值的比较 MUST 以常量时间执行, 以防止定时攻击.
3.3 使用 RSASSA-PKCS1-v1_5 的数字签名
本节定义 RSASSA-PKCS1-v1_5 数字签名算法与 SHA-2 哈希函数一起使用的方式. 该数字签名算法定义于 RFC 3447 [RFC3447] 第 8.2 节.
密钥要求: 此算法 MUST 使用大小为 2048 bits 或更大的密钥.
算法值:
| "alg" 参数值 | 数字签名算法 |
|---|---|
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 |
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 |
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 |
3.4 使用 ECDSA 的数字签名
椭圆曲线数字签名算法 (Elliptic Curve Digital Signature Algorithm, ECDSA) [DSS] 使用椭圆曲线密码学, 能够以更短的密钥长度和更快的处理速度提供与 RSA 等同的安全性.
支持的曲线和哈希函数:
- P-256 curve with SHA-256
- P-384 curve with SHA-384
- P-521 curve with SHA-512
ECDSA P-256 SHA-256 签名生成步骤:
- 使用私钥和 ECDSA P-256 SHA-256 为 JWS Signing Input 生成数字签名, 产生一个 (R, S) 对, 其中每个值都是 256-bit 无符号整数
- 将 R 和 S 转换为大端顺序的八位位组序列, 每个序列长度为 32 octets
- 按 R 后接 S 的顺序连接这两个八位位组序列
- 所得的 64-octet 序列就是 JWS Signature 值
算法值:
| "alg" 参数值 | 数字签名算法 |
|---|---|
| ES256 | ECDSA using P-256 and SHA-256 |
| ES384 | ECDSA using P-384 and SHA-384 |
| ES512 | ECDSA using P-521 and SHA-512 |
签名长度:
- ES256: 64 octets (R 和 S 各为 32 octets)
- ES384: 96 octets (R 和 S 各为 48 octets)
- ES512: 132 octets (R 和 S 各为 66 octets)
3.5 使用 RSASSA-PSS 的数字签名
本节定义 RSASSA-PSS 数字签名算法与 MGF1 掩码生成函数和 SHA-2 哈希函数一起使用的方式. RSASSA-PSS 数字签名算法定义于 RFC 3447 [RFC3447] 第 8.1 节.
密钥参数:
- RSASSA-PSS 哈希函数和 MGF1 哈希函数使用相同的哈希函数
- 盐值大小等于哈希函数输出大小
- 密钥大小要求: 2048 bits 或更大
算法值:
| "alg" 参数值 | 数字签名算法 |
|---|---|
| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 |
| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 |
| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 |
3.6 使用算法 "none"
JWS 规范 [JWS] 定义了 "alg" 值 "none", 用于创建不提供完整性保护的 Unsecured JWS 对象.
安全警告: 实现 MUST 理解使用此算法的安全影响. 只有在不需要完整性保护时, 才 SHOULD 使用 "alg" 值 "none".