使用Java进行JWT令牌验证

时间:2016-08-07 08:43:12

标签: java jwt digital-signature

我遇到的问题是,无论何时签署令牌,我都会解析它并且不会抛出任何签名异常。

你可以看到钥匙不同,它仍然给我正确的反应。

public class JwtUtil {

 public String parseToken(String token) {
    try {
       Jws<Claims> jwt = Jwts.parser()                  
                .setSigningKey("Test@12")                    
                .parseClaimsJws(token);


        System.out.println(jwt.getBody().getSubject());
        return "Valid";

    } catch (SignatureException jwtException) {
        jwtException.printStackTrace();
        return null;
     }
 }


public String generateToken() {

    Claims claim = Jwts.claims();
    claim.put("GivenName", "Johnny");
    claim.put("Surname", "Rocket");
    claim.put("Email", "jrocket@example.com");      

    return Jwts.builder().setHeaderParam("typ", "JWT").setClaims(claim)
            .setIssuer("Online JWT Builder")
            .setAudience("www.example.com").setSubject("jrocket@example.com")
            .signWith(SignatureAlgorithm.HS256, "Test@123").compact();


}

public static void main(String[] args) {
    JwtUtil jwtUtil = new JwtUtil();        
    String token = jwtUtil.generateToken();
    System.out.println(token);  

    JwtUtil jwtUtil1 = new JwtUtil();
    jwtUtil1.parseToken(token);
 }
}

1 个答案:

答案 0 :(得分:1)

真的 Test@12 Test@123 是相同的密钥

归功于JwtBuilder.signWith(SignatureAlgorithm alg, String base64EncodedSecretKey)。假设您在base64中提供了一个密钥,而您的密钥不是base64。当方法从base64解码为byte[]时,jjwt使用的java转换器提供字符串的表示。 Test@12Test@123使用字节数组

进行编码

请参阅https://stackoverflow.com/a/38269014/6371459

您可以使用

进行自我测试
System.out.println(
            javax.xml.bind.DatatypeConverter.printBase64Binary(
                    javax.xml.bind.DatatypeConverter.parseBase64Binary("Test@12")));
System.out.println(
            javax.xml.bind.DatatypeConverter.printBase64Binary(
                    javax.xml.bind.DatatypeConverter.parseBase64Binary("Test@123")));

尝试(更多)不同的密钥,SignatureException将被抛出