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
相关产品推荐
相关产品推荐

