JWT

* 什么是token

可以把token当成智能门锁,密码是有有效期的。就是在一段时间内,临时且唯一。

token如何生成:最简单的用UUID。唯一的。

项目中使用token和sessionid 非常相似,session类似redis存放缓存内容,sessionId类似与token。

传统项目里使用Session,缺陷:放入到服务器,如果不是单体架构,微服务的话session不是共享的。大的项目都是使用token顶替session,存放在redis里。

比如:一般的前后端登录,在登陆时候会传给前端一个token,这个token在后端会存在redis,作为redis的key,value为用户id,token返回给前端,前端存在cookie里。

客户端在每次请求时候会把token放在请求头,服务器在redis里根据对应的token查找对应的用户id。

Token优点:

  1、保证安全(可以隐藏用户信息的真实性)

  2、临时且唯一(还是保证安全性)

jwt 和token 设计思想是一样的

jwt:json-web-token

json:数据交换格式,轻量级、跨语言、可读性高。。

JWT:3个部分组成

  1、header:主要看标记的使用什么算法,HS256(对称加密,可破解)、RSA256(非对称加密,不可破解)

  2、PayLoad:(载荷),jwt存放的数据,以json格式存放,不可以存放敏感数据,因为是可以解密的。。

  3、sign:  是把PayLoad采用MD5加密后(或者是盐值加密)的签名照(MD5是不可逆的)

JWT:Base64.enCode(header) + Base64.enCode(PayLoad) + MD5加密的(PayLoad)

Base64 不属于对称加密,属于编码格式!!

JWT写法:

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.Base64;

public class JWTdemo {
    // 签名
    private static String SIGN_KEY = "test";

    public static void main(String[] args) {
        // header
        JSONObject header = new JSONObject();
        header.put("alg", "HS256");
        // payload
        JSONObject payload = new JSONObject();
        payload.put("phone", "132xxxxxxxx");
        // sign
        String payloadString = payload.toJSONString();
        String sign = DigestUtils.md5Hex(payloadString + SIGN_KEY);
        String jwt = Base64.getEncoder().encodeToString(header.toJSONString().getBytes()) + "." + Base64.getEncoder().encodeToString(payloadString.getBytes()) + "." + sign;
        System.out.println(jwt);


        // JWT 解密
        String[] split = jwt.split("\\.");
        String s = new String(Base64.getDecoder().decode(split[1].getBytes()));
        System.out.println(DigestUtils.md5Hex(s + SIGN_KEY).equals(sign));
        System.out.println(s);
    }

}

 

 

 

 

 

posted @ 2020-09-09 17:29  aBiu--  阅读(91)  评论(0)    收藏  举报