• JWT——jjwt使用


    一、JWT是什么?

    JWT (JSON Web Token) 是一种用于身份验证和授权的安全传输数据的开放标准。

    二、JWT构成

    0、header.payload.signature

    1、header 头部 (JSON数据,Base64加密)

    报头通常由两部分组成: Token的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256或 RSA)。

    • alg : HS256 : 签名使用的算法
    • typ : JWT :标识JWT

    2、payload 载荷 (JSON数据,Base64加密)

    载荷是实际的数据,其中包含声明。声明是关于实体(通常是用户)和其他数据的语句。
    有三种类型的声明:

    • registered claims,
    • public claims
    • private claims。

    下面是预定义的数据。

    • iss: jwt签发者
    • sub: jwt所面向的用户
    • aud: 接收jwt的一方
    • exp: jwt的过期时间,这个过期时间必须要大于签发时间
    • nbf: 定义在什么时间之前,该jwt都是不可用的.
    • iat: jwt的签发时间
    • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

    2.1、Public claims(公共的声明)

    使用 JWT 的人可以随意定义这些声明( 可以自己声明一些有效信息如用户的id,name等,但是不要设置一些敏感信息,如密码 )。但是为了避免冲突,应该在 JWT注册表中定义它们,或者将它们定义为包含抗冲突名称空间的 URI。

    2.2、Private claims(私人声明)

    这些是创建用于在同意使用它们的各方之间共享信息的习惯声明,既不是注册声明,也不是公开声明( 私人声明是提供者和消费者所共同定义的声明 )。

    2.3 注意:

    对于已签名的Token,这些信息虽然受到保护,不会被篡改,但任何人都可以阅读。除非加密,否则不要将机密信息放在 JWT 的有效负载或头元素中。

    3、signature 签名:

    签名用于验证JWT的完整性,确保在传输过程中没有被篡改。
    公式:
    HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload), secret)

    三、使用场景

    • Web API:JWT可以作为一种安全且高效的方式来验证请求,保护Web API不被恶意请求和数据盗用。

    • 单点登录(SSO):JWT可以使用户在一次身份验证后,通过使用同一个认证令牌,来访问多个应用程序。这样可以简化用户在不同应用程序之间的登录流程,提高用户体验。

    四、JAVA项目使用

    1、Maven依赖

    
    <dependency>
        <groupId>io.jsonwebtokengroupId>
        <artifactId>jjwtartifactId>
        <version>0.12.3version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、生成Token方法

    //私钥,注意私钥长度至少43位,不然生成Token会报错
    public static String secret ="123456789a123456789a123456789a123456789a123";
    public static String createToken(){
        
    
        // Header
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");
    
        // Payload
        Map<String, Object> payload = new HashMap<>();
        payload.put("id", "malu_code");
        payload.put("name","码鹿");
        payload.put("admin",true);
    
        // 声明Token失效时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,300);// 300s
    
        // 生成Token
        String token = Jwts.builder()
                .setHeader(header)// 设置Header
                .setClaims(payload) // 设置Payload
                .setExpiration(instance.getTime())// 设置生效时间
                .signWith(SignatureAlgorithm.HS256,secret) // 签名,这里采用私钥进行签名,不要泄露了自己的私钥信息
                .compact(); //生成Token
    
        return  token;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3、解析Token方法

    如果可以成功解析、不报异常,那token就是对的。

    //私钥,注意私钥长度至少43位,不然生成Token会报错
    public static String secret ="123456789a123456789a123456789a123456789a123";
    public static boolean parserToken(String token) {
        JwtParser jwtParser = Jwts.parser().setSigningKey(secret).build();
        try {
            Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
            // 解析head信息
            JwsHeader header = claimsJws.getHeader();
            // 解析Payload
            Claims claims = claimsJws.getBody();
            System.out.println(claims);
            // 解析Signature
            String signature = claimsJws.getSignature();
            System.out.println(signature); 
        }catch (Exception e){
            return false;
        }
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    阿里巴巴淘口令API的安全保障措施在电商领域的应用与实践
    mac git ssh
    Google Earth Engine(GEE)——一个简单的时序动画UI
    铁矿行业BI经营分析框架(二)万能框架-增长性、盈利性、流动性
    windows下go的相关玩法
    Editor vs. Editor In Chief:有什么区别?
    吹爆,阿里最新开源的这份Redis全栈小册,涵盖了Redis的所有操作
    Java -- 每日一问:Exception 和 Error 有什么区别?
    gRPC博客【建设进度0%】
    【GNN】Graph Lifelong Learning: A Survey
  • 原文地址:https://blog.csdn.net/malu_record/article/details/133974081