jjwt解析jwt时公钥不安全The verification key‘s size is 1024 bits which is not secure enough for the RS256....

本次是php项目,做java重构的时候,php代码是可以正常运行的,java代码使用的是jjwt解析jwt,抛出的异常。异常信息大体描述是秘钥格式不符合要求,对于jjwt中有秘钥格式长度校验机制。

原有的RSA算法私钥长度1024已经不符合要求

1、需要重新更换秘钥长度,重新生成更安全的密钥对。

2、考虑去掉秘钥长度校验,还是使用之前的短的秘钥对。

错误堆栈信息

The verification key's size is 1024 bits which is not secure enough for the RS256 algorithm

io.jsonwebtoken.security.WeakKeyException: The verification key's size is 1024 bits which is not secure enough for the RS256 algorithm.  The JWT JWA Specification (RFC 7518, Section 3.3) states that keys used with RS256 MUST have a size >= 2048 bits.  Consider using the io.jsonwebtoken.security.Keys class's 'keyPairFor(SignatureAlgorithm.RS256)' method to create a key pair guaranteed to be secure enough for RS256.  See https://tools.ietf.org/html/rfc7518#section-3.3 for more information.
	at io.jsonwebtoken.SignatureAlgorithm.assertValid(SignatureAlgorithm.java:424)
	at io.jsonwebtoken.SignatureAlgorithm.assertValidVerificationKey(SignatureAlgorithm.java:315)
	at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:364)
	at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:513)
	at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:573)
	at com.sprucetec.mall.entrance.api.dto.jwt.JwtTest1.main(JwtTest1.java:46)
Exception in thread "main" java.lang.NullPointerException
	at com.sprucetec.mall.entrance.api.dto.jwt.JwtTest1.main(JwtTest1.java:54)

解析代码:

jwt解析代码
Claims claims = Jwts.parser().setSigningKey(rsaPublicKey).parseClaimsJws(jwt_token).getBody();
网上有很多类似的代码,都是使用jjwt类来解析jwt

解析时使用的公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXEXtLH4nrLgKaWBiYaDDrsRs
/115pAp9RlX4UNnBdsQoLROq6MIxZ0v/pxhJfjFZec8N9HedQgRVImDIqltpmUL9
kxV8+VHKzj3bP3ztZ3PDkZBEYGHH8aQzD/EHy+C1vrz96omXhQGzXnxuN5wc0rlJ
PKAky46qDaWA8MghhwID****(隐藏了)
-----END PUBLIC KEY-----
 

php代码使用这个公钥解析时是可以正常运行的。但是java的解析类就抛出了对应的错误。

从上面的错误信息中可以看出来,由于公钥过短,jwt解析时会判断长度是否符合安全要求,若不符合,将抛出校验安全错误。

深入代码中看下 在DefaultJwtParser类下的parse方法中,有一段对秘钥的安全检查。异常也是这里抛出来的。

algorithm.assertValidVerificationKey(key);


问题找到了。因为校验秘钥安全性,导致的问题。因为秘钥没法替换,只能使用之前的秘钥。不考虑生成新密钥对的,故考虑去掉校验机制。

这时候想是否可以将这个方法覆盖掉。自己重新写一个DefaultJwtParser,去掉这一段秘钥校验逻辑。

自己写一个MyDefaultJwtParser类,类中的的方法完全拷贝DefaultJwtParser,只是去掉了  algorithm.assertValidVerificationKey(key);  这一行

解析正常:

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在Spring Boot中使用jwt.io库来解析JWT,您需要按照以下步骤进行操作: 1. 在pom.xml中引入JWT库的依赖: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> ``` 引用 2. 创建一个工具类来处理JWT解析: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; public class JwtUtils { public static Claims parseJwt(String jwtToken, String secretKey) { return Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(jwtToken) .getBody(); } } ``` 引用 3. 在您的Spring Boot应用程序中调用JwtUtils类来解析JWT: ```java String jwtToken = "your_jwt_token_here"; String secretKey = "your_secret_key_here"; Claims claims = JwtUtils.parseJwt(jwtToken, secretKey); ``` 通过这些步骤,您就可以在Spring Boot中使用jwt.io库来解析JWT了。请确保将"your_jwt_token_here"和"your_secret_key_here"替换为实际的JWT令牌和秘钥。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Springboot + JWT-Token 生成与解析](https://blog.csdn.net/gaogzhen/article/details/113106736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [springboot集成socket.io通过jwt-token身份认证鉴权](https://blog.csdn.net/qq_16334741/article/details/122949127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值