Skip to main content

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 算法实现要求
HS256HMAC using SHA-256Required
HS384HMAC using SHA-384Optional
HS512HMAC using SHA-512Optional
RS256RSASSA-PKCS1-v1_5 using SHA-256Recommended
RS384RSASSA-PKCS1-v1_5 using SHA-384Optional
RS512RSASSA-PKCS1-v1_5 using SHA-512Optional
ES256ECDSA using P-256 and SHA-256Recommended+
ES384ECDSA using P-384 and SHA-384Optional
ES512ECDSA using P-521 and SHA-512Optional
PS256RSASSA-PSS using SHA-256 and MGF1 with SHA-256Optional
PS384RSASSA-PSS using SHA-384 and MGF1 with SHA-384Optional
PS512RSASSA-PSS using SHA-512 and MGF1 with SHA-512Optional
none无数字签名或 MACOptional

注: Implementation Requirements 列中的 "+" 表示该要求强度可能在规范的未来版本中增加.

3.2 HMAC with SHA-2 Functions (使用 SHA-2 函数的 HMAC)

基于哈希的消息认证码 (HMACs) 允许使用密钥和加密哈希函数生成 MAC. 算法在 RFC 2104 [RFC2104] 中定义.

密钥要求: 必须 (MUST) 使用与哈希输出大小相同或更大的密钥 (例如, HS256 使用 256 位或更大).

HMAC 算法值:

"alg" 参数值MAC 算法
HS256HMAC using SHA-256
HS384HMAC using SHA-384
HS512HMAC 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" 参数值数字签名算法
RS256RSASSA-PKCS1-v1_5 using SHA-256
RS384RSASSA-PKCS1-v1_5 using SHA-384
RS512RSASSA-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 签名生成步骤:

  1. 使用 ECDSA P-256 SHA-256 和私钥生成 JWS Signing Input 的数字签名, 输出为 (R, S) 对, 每个为 256 位无符号整数
  2. 将 R 和 S 转换为大端序八位字节序列, 每个 32 字节长
  3. 按 R 然后 S 的顺序连接两个八位字节序列
  4. 生成的 64 字节序列即为 JWS Signature 值

算法值:

"alg" 参数值数字签名算法
ES256ECDSA using P-256 and SHA-256
ES384ECDSA using P-384 and SHA-384
ES512ECDSA 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" 参数值数字签名算法
PS256RSASSA-PSS using SHA-256 and MGF1 with SHA-256
PS384RSASSA-PSS using SHA-384 and MGF1 with SHA-384
PS512RSASSA-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" 只能在不需要完整性保护的情况下使用.