You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot升级后JJWT 0.9.1出现SignatureException签名不匹配问题

解决JJWT 0.9.1签名不匹配异常(SignatureException)

你的问题根源是令牌生成与解析阶段的密钥处理逻辑不一致,导致签名验证失败。

问题分析

  • 生成令牌时,直接传入原始密钥字符串jwtsSigningKey:

    String token = Jwts.builder().setSubject(loginId)
            // 省略claim配置
            .signWith(SignatureAlgorithm.HS256, jwtsSigningKey).compact();
    

    JJWT 0.9.1在使用HS256算法时,会自动将该字符串按UTF-8编码转为字节数组,作为HMAC-SHA256的签名密钥。

  • 解析令牌时,却对原始密钥做了Base64编码:

    String signingKeye = Base64.getEncoder().encodeToString(signingKey.getBytes());
    Claims claims = Jwts.parser().setSigningKey(signingKeye).parseClaimsJws(appToken).getBody();
    

    这相当于使用了和生成阶段完全不同的密钥,自然触发签名不匹配的SignatureException。

解决方案

方案1:统一使用原始密钥(推荐)

修改解析代码,直接传入原始密钥字符串,保持和生成逻辑一致:

Claims claims = Jwts.parser().setSigningKey(signingKey).parseClaimsJws(appToken).getBody();

⚠️ 确保signingKey和生成时的jwtsSigningKey是完全相同的字符串,且转换字节数组时使用统一编码(默认UTF-8即可)。

方案2:统一使用Base64编码后的密钥

如果业务需要使用Base64编码的密钥,需同步修改生成代码,确保两边处理逻辑一致:

// 生成阶段先编码密钥
String encodedKey = Base64.getEncoder().encodeToString(jwtsSigningKey.getBytes());
String token = Jwts.builder().setSubject(loginId)
        // 保留原有claim配置
        .signWith(SignatureAlgorithm.HS256, encodedKey)
        .compact();

此时解析代码可保持不变,两边密钥一致即可通过验证。

额外检查点

  • 确认signingKey与jwtsSigningKey的配置值完全一致,避免环境配置错误
  • 密钥转换字节数组时,不要混用不同编码(如生成用UTF-8,解析用GBK)

内容的提问来源于stack exchange,提问作者Nihar Ranjan Khatua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:12:52