Jwt 初识以及加密和解密

 简介

JWT规范将一个token分为3部分,分别是标头(header)、载荷(payload)、签名(verify signature)三部分并以.进行分割,也就是说一个符合JWT规范所生成的token格式应当如下: xxxxx.yyyyy.zzzzz

jwt.io网址可以帮忙解码如下图,官网地址JSON Web Tokens - jwt.io ,jwt代码样子如下图左侧

JWT生成的token由三部分组成,也是上图右边三个模块:

  • 头部(header):主要设置一些规范信息,签名部分的编码格式(用的什么加密算法)就在头部中声明。

  • 载荷(payload):token中存放有效信息的部分,比如用户名,用户角色,过期时间等,但是不要放密码,会泄露!

  • 签名(sign):将头部与载荷分别采用base64编码后,用“.”相连,再加入盐,最后使用头部声明的编码类型进行编码,就得到了签名。

    验证方式

    请求来时,客户端进行算法解析,将头部和载荷进行解析,然后会将签名通过头部编码进行解码加上盐,解析后载荷和签名进行对比,查看是否一致,然后保证签名的合法性

    缺点

    其缺点也很明显,token由于⾃包含信息,因此⼀般数据量较⼤,⽽且每次请求 都需要传递,因此⽐较占带宽。另外,token的签名验签操作也会给cpu带来额外的处理负担。

 加密生成token

  //生成token
    public static void main(String[] args) {
        //设置载荷数据
        Claims claims = Jwts.claims();
        List<String> roles = Arrays.asList("1","22","33");
        claims.put("role", roles);
        String token = Jwts.builder()
                //设置标头参数,JWT标头应当写明有关JWT的格式和加密操作的相关数据,想设置多个就重复写setHeaderParam即可。
                //.setHeaderParam("typ", "JWT")
                //.setHeaderParam("cde", "abc")
                //载荷用于存储需要的数据
                .setClaims(claims)
                //设置用户名
                .setSubject("A乐神")
                //设置token过期时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000000))
                //设置token签名算法及秘钥
                .signWith(SignatureAlgorithm.HS512, "加密盐")
                .compact();
    }

解密还原

   String token = "上面方法生成的tokeneyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLlj6_ovr7puK0ifQ.9YyUs3TafLrJoXmBwMswFHW_ycQkTlhqaKti4Wh2aoM";
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey("加密盐")
                    .parseClaimsJws(token)
                    .getBody();
            //结果是上述代码"1","22","33"
            List<String> roles = claims.get("role");
            //结果是上述代码A乐神
            String subject = claims.getSubject();
        }catch (ExpiredJwtException e) {
            System.out.println("token已过期");
        }catch (SignatureException e) {
            System.out.println("token不合法");
        }

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!小弟在这拜谢了!
如果您觉得我的文章在某些地方写的不尽人意或者写的不对,从而让你对你人生观产生颠覆(概不负责),需要斧正,麻烦在评论区不吝赐教,作者看到后会根据您的提示查阅文章进行修改,还这世间一个公理一片蓝天

 

相关推荐

  1. Django,以及路由设置

    2024-01-08 09:28:03       31 阅读
  2. Jwt生成token以及解析token

    2024-01-08 09:28:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 09:28:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 09:28:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 09:28:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 09:28:03       20 阅读

热门阅读

  1. 机器学习部分培训资料

    2024-01-08 09:28:03       36 阅读
  2. 阿里云大数据ACA及ACP复习题(61~80)

    2024-01-08 09:28:03       32 阅读
  3. Python高级用法:上下文

    2024-01-08 09:28:03       35 阅读
  4. 找不到模块 “path“ 或其相对应的类型声明

    2024-01-08 09:28:03       38 阅读
  5. Spring之单元测试

    2024-01-08 09:28:03       31 阅读