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("=============="+"验证失败"); } } }