gpt4 book ai didi

java - 如果 SigningKey 略有不同,JJWT 解析不会失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:04 25 4
gpt4 key购买 nike

我尝试创建 JWT token

final String jws = Jwts.builder()
.claim("rainId", rainId.toString())
.signWith(SignatureAlgorithm.HS256, TextCodec.BASE64.decode("jwtSecretKey"))
.compact();

然后我尝试解析它

Jws<Claims> jwsClaims = Jwts.parser()
.require("rainId", rainId.toString())
.setSigningKey(TextCodec.BASE64.decode("jwtSecretKey1"))
.parseClaimsJws(jws);

如您所见,SigningKey 略有不同,因此我预计解析器会失败,但并没有发生。只有当解析器中的 SigningKey 有很大差异时才会发生。例如“jwtSecretKey111111111111111111111111111111”或“dsfdsfdsfdsfds”。如果解析器中的 SigningKey 略有不同,有人可以解释为什么解析器不会失败吗?

我用

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>

最佳答案

您似乎没有正确使用 API。

signWith()setSigningKey() 方法都需要一个 Base64 编码的字符串作为输入。但是您正在调用 TextCodec.BASE64.decode("...")

jwtSecretKeyjwtSecretKey1 看起来都不像 Base64 编码的字符串。但是,如果您尝试解码它们,它们将产生相同的输出:

System.out.println(Arrays.toString(TextCodec.BASE64.decode("jwtSecretKey")));
System.out.println(Arrays.toString(TextCodec.BASE64.decode("jwtSecretKey1")));
[-113, 11, 82, 121, -54, -34, -76, -89, -78]
[-113, 11, 82, 121, -54, -34, -76, -89, -78]

这就是签名验证不会失败的原因。

您应该改用 TextCodec.BASE64.encode("..."),如下所示:

String jws = Jwts.builder()
.claim("rainId", rainId.toString())
.signWith(SignatureAlgorithm.HS256, TextCodec.BASE64.encode("jwtSecretKey"))
.compact();

Jws<Claims> jwsClaims = Jwts.parser()
.require("rainId",rainId.toString())
.setSigningKey(TextCodec.BASE64.encode("jwtSecretKey1"))
.parseClaimsJws(jws);

关于java - 如果 SigningKey 略有不同,JJWT 解析不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52623326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com