В проекте использовалась устаревшая библиотека
jjwt-0.7.0, которая при использовании строки в качестве секрета неявно декодировала его с помощью Base64, даже если это невалидная base64-строка.В результате, при использовании следующего кода:
private static String SECRET = "#%j?_GtEhNS!-WH.Vq!";
private static long EXPIRATION = 3600L;
public static String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", username);
Date exp = new Date(System.currentTimeMillis() + (EXPIRATION * 1000));
return Jwts.builder()
.setClaims(claims)
.setExpiration(exp)
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
Вместо секрета
#%j?_GtEhNS!-WH.Vq! вы получаете всего 6 символов 0x8c, 0x6b, 0x44, 0x84, 0xd4, 0x96 или base64_decode("jGtEhNSW").Все символы, не относящиеся к Base64, удаляются, а последовательность
HVq отброшена, так как для корректного Base64 ей не хватает необходимого паддинга =.