Jwt 初识以及加密和解密

 

目录

简介

验证方式

缺点

 加密生成token

解密还原


前言-与正文无关

      生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活。

        送你张美图!希望你开心!

简介

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不合法");
        }

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

关注在文章左上角,作者信息处。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证的开放标准(RFC 7519)。它是基于JSON(JavaScript Object Notation)格式的数据结构,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 JWT加密/解密过程可以采用对称加密或非对称加密。对称加密使用同一个密钥进行加密解密,而非对称加密使用公钥加密,私钥解密。 以下是JWT使用对称加密和非对称加密加密/解密过程: 1. 对称加密 加密过程: 1)将头部和载荷进行Base64编码,得到第一部分:Base64UrlEncode(header) + "." + Base64UrlEncode(payload)。 2)使用密钥对第一部分进行加密。 3)对加密后的结果进行Base64UrlEncode,得到第三部分:Base64UrlEncode(signature)。 解密过程: 1)将JWT字符串按照“.”分割成三部分。 2)使用密钥对第一部分进行解密。 3)对解密后的结果进行Base64解码,得到头部和载荷。 4)对解密后的结果和密钥进行签名验证。 2. 非对称加密 加密过程: 1)将头部和载荷进行Base64编码,得到第一部分:Base64UrlEncode(header) + "." + Base64UrlEncode(payload)。 2)使用私钥对第一部分进行签名。 3)对签名后的结果进行Base64UrlEncode,得到第三部分:Base64UrlEncode(signature)。 解密过程: 1)将JWT字符串按照“.”分割成三部分。 2)对第一部分和第三部分进行Base64解码,得到头部、载荷和签名。 3)使用公钥对签名进行验证。 4)验证通过后,得到解密后的头部和载荷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A乐神

恭喜发财啊,老板,嘻嘻!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值