Skip to content

签名算法

CyberGo JWT 支持 4 类共 12 种签名算法,覆盖从单体应用到微服务架构的各种场景。

算法一览

类型算法密钥类型适用场景
HMACHS256 / HS384 / HS512对称密钥单体应用、简单服务
RSARS256 / RS384 / RS512公钥/私钥微服务、多服务验证
RSA-PSSPS256 / PS384 / PS512公钥/私钥微服务(推荐替代 RSA)
ECDSAES256 / ES384 / ES512公钥/私钥高性能微服务

HMAC(对称密钥)

HMAC 使用同一密钥签名和验证,是最简单的方案。

密钥要求

  • 最少 32 字节
  • 库会自动检测弱密钥(如纯重复字符、简单递增序列等)

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SecretKey = "hmac-key-that-has-at-least-32-bytes!"
cfg.SigningMethod = jwt.SigningMethodHS256 // 默认值,可省略

算法选择

常量算法说明
SigningMethodHS256HMAC-SHA256推荐,性能与安全均衡
SigningMethodHS384HMAC-SHA384更高安全性
SigningMethodHS512HMAC-SHA512最高安全性

推荐

大多数场景使用 HS256 即可。密钥建议使用密码学安全随机生成,长度至少 32 字节。

RSA(非对称密钥)

RSA 使用私钥签名、公钥验证。适用于验证端不需要持有私钥的场景。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodRS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey(可选)

验证密钥

VerificationKey 可选。不设置时,库使用 SigningKey 进行验证(内部从私钥提取公钥)。

密钥生成

go
// 生成 2048 位 RSA 密钥对
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

算法选择

常量算法说明
SigningMethodRS256RSA-SHA256推荐
SigningMethodRS384RSA-SHA384更高安全性
SigningMethodRS512RSA-SHA512最高安全性

RSA-PSS(非对称密钥,推荐替代 RSA)

RSA-PSS 是 RSA 的改进签名方案,使用概率签名方案(PSS)填充,安全性优于 PKCS#1 v1.5。密钥与 RSA 相同。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodPS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey(与 RSA 共用密钥)
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey(可选)

推荐替代

RSA-PSS 比 RSA PKCS#1 v1.5 更安全,建议新项目优先使用 RSA-PSS 算法。密钥与 RSA 完全相同,无需额外生成。

算法选择

常量算法说明
SigningMethodPS256RSA-PSS-SHA256推荐
SigningMethodPS384RSA-PSS-SHA384更高安全性
SigningMethodPS512RSA-PSS-SHA512最高安全性

ECDSA(椭圆曲线)

ECDSA 同样是非对称算法,但密钥更短、性能更好。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodES256
cfg.SigningKey = ecdsaPrivateKey      // *ecdsa.PrivateKey
cfg.VerificationKey = ecdsaPublicKey  // *ecdsa.PublicKey(可选)

密钥生成

go
// 生成 P-256 曲线密钥对
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

算法选择

常量算法曲线说明
SigningMethodES256ECDSA-SHA256P-256推荐
SigningMethodES384ECDSA-SHA384P-384更高安全性
SigningMethodES512ECDSA-SHA512P-521最高安全性

如何选择

text
单体应用 ──────────→ HMAC
微服务(同信任域) ──→ HMAC
微服务(跨服务验证)→ RSA、RSA-PSS 或 ECDSA
安全性优先 ────────→ RSA-PSS(替代 RSA)
高性能要求 ────────→ ECDSA
密钥长度敏感 ──────→ ECDSA
考量因素HMACRSARSA-PSSECDSA
签名速度较慢较慢
验证速度
密钥长度32+ 字节2048+ 位2048+ 位256+ 位
签名长度固定长(~256 字节)长(~256 字节)短(~64 字节)
架构耦合紧耦合松耦合松耦合松耦合
安全性更高

安全注意事项

禁止事项

  • 不要在代码中硬编码密钥
  • 不要使用弱密钥(纯数字、重复字符等)
  • 不要使用 none 算法(本库自动拒绝)
  • HMAC 密钥不要短于 32 字节

最佳实践

  • 使用环境变量或密钥管理服务存储密钥
  • 定期轮换签名密钥
  • 生产环境建议使用 RSA 或 ECDSA
  • RSA 密钥建议 2048 位以上

下一步