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); } }



浙公网安备 33010602011771号