Анализ JJWT не завершится неудачей, если SigningKey немного отличается - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать токен JWT

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 в парсере имеет очень большую разницу.Например, «jwtSecretKey1111111111111111111111111111111» или «dsfdsfdsfdsfds».Может кто-нибудь объяснить, почему не работает парсер, если SigningKey в парсере немного отличается?

Я использую

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

1 Ответ

0 голосов
/ 03 октября 2018

Похоже, вы не используете API должным образом.

Оба метода signWith() и setSigningKey() ожидают строку в кодировке Base64 в качестве ввода.Но вы вызываете TextCodec.BASE64.decode("...").

И jwtSecretKey, и jwtSecretKey1 не похожи на строки в кодировке 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);
...