3. Cryptographic Algorithms for Digital Signatures and MACs (数字签名和 MAC 的加密算法)
JWS 使用加密算法对 JWS Protected Header 和 JWS Payload 的内容进行数字签名或创建 MAC.
3.1 "alg" (Algorithm) Header Parameter Values for JWS (JWS 的 "alg" 参数值)
本规范为 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 | 无数字签名或 MAC | Optional |
注: Implementation Requirements 列中的 "+" 表示该要求强度可能在规范的未来版本中增加.
3.2 HMAC with SHA-2 Functions (使用 SHA-2 函数的 HMAC)
基于哈希的消息认证码 (HMACs) 允许使用密钥和加密哈希函数生成 MAC. 算法在 RFC 2104 [RFC2104] 中定义.
密钥要求: 必须 (MUST) 使用与哈希输出大小相同或更大的密钥 (例如, HS256 使用 256 位或更大).
HMAC 算法值:
| "alg" 参数值 | MAC 算法 |
|---|---|
| HS256 | HMAC using SHA-256 |
| HS384 | HMAC using SHA-384 |
| HS512 | HMAC using SHA-512 |
验证要求: HMAC 值的比较必须 (MUST) 以恒定时间方式进行以防止时序攻击.
3.3 Digital Signature with RSASSA-PKCS1-v1_5 (使用 RSASSA-PKCS1-v1_5 的数字签名)
使用 RFC 3447 [RFC3447] 第 8.2 节定义的 RSASSA-PKCS1-v1_5 数字签名算法和 SHA-2 哈希函数.
密钥要求: 必须 (MUST) 使用 2048 位或更大的密钥.
算法值:
| "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 Digital Signature with ECDSA (使用 ECDSA 的数字签名)
椭圆曲线数字签名算法 (ECDSA) [DSS] 使用椭圆曲线密码学, 能够以更短的密钥长度和更快的处理速度提供与 RSA 加密等效的安全性.
支持的曲线和哈希函数:
- P-256 曲线与 SHA-256
- P-384 曲线与 SHA-384
- P-521 曲线与 SHA-512
ECDSA P-256 SHA-256 签名生成步骤:
- 使用 ECDSA P-256 SHA-256 和私钥生成 JWS Signing Input 的数字签名, 输出为 (R, S) 对, 每个为 256 位无符号整数
- 将 R 和 S 转换为大端序八位字节序列, 每个 32 字节长
- 按 R 然后 S 的顺序连接两个八位字节序列
- 生成的 64 字节序列即为 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 字节 (R 和 S 各 32 字节)
- ES384: 96 字节 (R 和 S 各 48 字节)
- ES512: 132 字节 (R 和 S 各 66 字节)
3.5 Digital Signature with RSASSA-PSS (使用 RSASSA-PSS 的数字签名)
使用 RFC 3447 [RFC3447] 第 8.1 节定义的 RSASSA-PSS 数字签名算法, 带 MGF1 掩码生成函数和 SHA-2 哈希函数.
关键参数:
- RSASSA-PSS 哈希函数和 MGF1 哈希函数使用相同的哈希函数
- 盐值大小与哈希函数输出大小相同
- 密钥大小要求: 2048 位或更大
算法值:
| "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 Using the Algorithm "none" (使用 "none" 算法)
JWS 规范 [JWS] 定义了 "alg" 值 "none", 用于创建不提供完整性保护的不安全 JWS (Unsecured JWS).
安全警告: 实现必须理解使用此算法的安全影响. "alg" 值 "none" 只能在不需要完整性保护的情况下使用.