在 jwt.io 调试器中使用 Java JJWT 签名生成失败

2022-01-10 00:00:00 jwt java jjwt json-web-token

我在 servlet 上使用 jjwt Java 库在服务器端生成 jwt,下面的代码截图直接来自 jjwt GitHub 页面 https://github.com/jwtk/jjwt 生成并打印出这个令牌.

I am using the jjwt Java library for server side generation of jwt in on servlets, the code snipper below straight from the jjwt GitHub page https://github.com/jwtk/jjwt generates and prints out this token.

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.XIKER3owR8BS3Krhsksg9INh9VBSejdn_qN-ONtPans

 String compactJws = Jwts.builder()
      .setSubject("Joe")
      .signWith(SignatureAlgorithm.HS256, "secret")
      .compact();
  PrintWriter out = response.getWriter();
  out.println(compactJws);

但是,当我尝试在 jwt.io 的调试器上验证此令牌时,签名检查失败.检查和取消检查秘密 base64 编码都不起作用

However, when I try to verify this token on jwt.io's debugger, it fails the signature check. Both checking and unchecking secret base64 encoded didn't work

我是否错误地使用了库?

Am I using the library wrongly?

推荐答案

尝试使用 secr 并检查 base64 选项:)

Try with secr and check the base64 option :)

这是由于 .signWith(SignatureAlgorithm.HS256, "secret") 造成的.它由 DefaultJwtBuilder 实现 类

It is due to .signWith(SignatureAlgorithm.HS256, "secret"). It is implemented by DefaultJwtBuilder class

public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) 

此方法假定您提供的是 base64 密钥,并且 secret 不是 base64.当方法从 base64 解码到 byte[] 时,jjwt 使用的 java 转换器提供字符串 secr 这与 jwt.io

This method assumes that you are providing a key in base64 and secret is not base64. When the method decodes from base64 to byte[] the java converter used by jjwt provides a representation of the string secr which is different to the JavaScript decoder used at jwt.io

你可以自己测试

System.out.println(
                javax.xml.bind.DatatypeConverter.printBase64Binary(
                        javax.xml.bind.DatatypeConverter.parseBase64Binary("secret")));

相关文章