JWT

JWT

json web token

JSON:   轻量级的可读性高的跨语言的数据交换格式

用户登录,前后端分离项目

1、登录验证账号密码,在验证成功的情况下执行下面操作

2、使用UUID生成对应token

3、将token缓存到redis中    redis:  key=token, value=user_id

4、将token返回给前端

5、前端将token保存到cookie中

6、前端每次请求时在请求头中传递该token

7、后端收到token后,到redis中根据key=token, 查找对应user_id

8、后端根据user_id存在与否查询返回各种对应信息,刷新redis有效期

token优点:

1、隐藏参数

2、唯一性

3、临时性

加密算法:

单向加密   MD5    不能解密(只能暴力破解)

双向加密 (对称加密) aes des

非对称加密  rsa

private String SIGN_KEY = "my_kt";
@Test
    public void test1(){
        //创建jwt
        JwtBuilder jwtBuilder = Jwts.builder()
                //存放PayLoad中的数据
                .claim("phone","10086")
                //设置签名值
                .signWith(SignatureAlgorithm.HS256,SIGN_KEY);

        System.out.println("===="+jwtBuilder.compact());
    }
====eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjEwMDg2In0.QU42Rfq8-h6pZ0yK3CfOWeeoIupHBIhRSDCAvThDffM

HS256  ->  MD5 单向加密

JWT 分成三部分

第一部分: header 头部,标记使用什么算法:HS256,RSA256

第二部分:PayLoad (载荷) Jwt存放的数据,注意不要存放敏感数据

第三部分:PayLoad采用MD5加密后的签名值

JWT 生成: Base64.ENcode(header).Base64.ENcode(PayLoad).签名值

Base64 不属于对称加密,属于编码器

package com.example.jwtdemo;

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import org.json.JSONException;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.DigestUtils;

import java.util.Base64;
import java.util.UUID;

@SpringBootTest
class JwtdemoApplicationTests {

    private String SIGN_KEY = "my_kt";

    @Test
    void contextLoads() {
    }

    @Test
    public void test1(){
        //创建jwt
        JwtBuilder jwtBuilder = Jwts.builder()
                //存放PayLoad中的数据
                .claim("phone","10086")
                //设置签名值
                .signWith(SignatureAlgorithm.HS256,SIGN_KEY);

        System.out.println("===="+jwtBuilder.compact());
    }

    @Test
    public void test2() throws JSONException {
        //第一部分
        JSONObject header = new JSONObject();
        header.put("alg","HS256");
        //每二部分
        JSONObject payload = new JSONObject();
        payload.put("user_id_uuid", UUID.randomUUID());
        //第三部分,payload实现MD5加密或其它加密
        String sign = DigestUtils.md5DigestAsHex((payload+SIGN_KEY).getBytes());

        String jwt = Base64.getEncoder().encodeToString(header.toString().getBytes())+"."
                + Base64.getEncoder().encodeToString(payload.toString().getBytes())+"."
                + sign;

        System.out.println("==========jwt=="+jwt);
    }

}
==========jwt==eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkX3V1aWQiOiIwNmQwODc3Yi0xYTI4LTQ3N2MtOWY0Yy0zODI3ODhkYzU3MjUifQ==.8db112869d8a75cd088e0bfa60ddefb7

package com.example.jwtdemo;

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import org.json.JSONException;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.DigestUtils;

import java.util.Base64;
import java.util.UUID;

@SpringBootTest
class JwtdemoApplicationTests {

    private String SIGN_KEY = "my_kt";

    @Test
    void contextLoads() {
    }

    @Test
    public void test1(){
        //创建jwt
        JwtBuilder jwtBuilder = Jwts.builder()
                //存放PayLoad中的数据
                .claim("phone","10086")
                //设置签名值
                .signWith(SignatureAlgorithm.HS256,SIGN_KEY);

        System.out.println("===="+jwtBuilder.compact());
    }

    @Test
    public void test2() throws JSONException {
        //第一部分
        JSONObject header = new JSONObject();
        header.put("alg","HS256");
        //每二部分
        JSONObject payload = new JSONObject();
        payload.put("user_id_uuid", UUID.randomUUID());
        //第三部分,payload实现MD5加密或其它加密
        String sign = DigestUtils.md5DigestAsHex((payload+SIGN_KEY).getBytes());

        String jwt = Base64.getEncoder().encodeToString(header.toString().getBytes())+"."
                + Base64.getEncoder().encodeToString(payload.toString().getBytes())+"."
                + sign;

        System.out.println("==========jwt=="+jwt);
    }
    @Test
    public void test3(){
        String jwt_encode_str = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkX3V1aWQiOiIwNmQwODc3Yi0xYTI4LTQ3N2MtOWY0Yy0zODI3ODhkYzU3MjUifQ==.8db112869d8a75cd088e0bfa60ddefb7";
        String[] jwt_encode_arr = jwt_encode_str.split("\.");
        String header = new String(Base64.getDecoder().decode(jwt_encode_arr[0].getBytes()));
        String payload = new String(Base64.getDecoder().decode(jwt_encode_arr[1].getBytes()));
        String sign = DigestUtils.md5DigestAsHex((payload+SIGN_KEY).getBytes());

        if(sign.equals(jwt_encode_arr[2])){
            System.out.println("=============="+"验证通过");
        }else{
            System.out.println("=============="+"验证失败");
        }
    }

}
原文地址:https://www.cnblogs.com/mingforyou/p/14674116.html