• 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("=============="+"验证失败");
            }
        }
    
    }
  • 相关阅读:
    在.net中过滤敏感字符
    const和readonly的联系和区别
    新闻内容页分页的简单做法
    jmail邮件发送问题
    nvarchar与varchar的区别
    C#中"is" vs "as"
    在C#中,string 类型可与SQL SERVER中的int 类型作比较
    做网站常用代码集锦 (转)
    做网站常用代码集锦 (转)
    ADO 数据类型转换表 oledbtype sqldbtype (二)
  • 原文地址:https://www.cnblogs.com/mingforyou/p/14674116.html
Copyright © 2020-2023  润新知