先看看,用户和服务器的交互 -- 面上是这样子的:
token的样子:
你看上图,三个部分组成,每个部分中,由 " . ",逗号分割;
token为什么张这个样子?
因为规定了,token由三个部分组成(就像:如果你是马斯克,你可以给自己的产品命名:特斯拉 ,一样的道理)
所以我们有必要了解,这一串中,3各部分是干什么的?内容是什么?
JWT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成Token,三部分之间用“.”号做分割。
我先上一张图,结合图下面的解释,会理解清除:
Header头部 -- A区域:
这个区域是一个字符串,主要是告诉你:我是通过HS535进行加密. (哈希加密)
Payload负载 -- B区域:
这个区域也是字符串,保存用户的信息,比如:用户id、token创建时间、token超时时间
但是,不会包含敏感信息,比如:密码
Signature签名 -- C区域:
这个区域,就简单了,哈:
C=(A+B)*HS535加密+加盐(加盐只有服务器知道盐的内容))*base64rul加案,
上面这段看不懂就看下面这句话(其实相对男一丢丢):
C区域其实就是:A 和 B区域链接到一起,进行加密之后的结果(可以理解成字符串)
2024年2月7日16:38:25,快放年假了,先写到这,下面写加密过程:
用户登录之后,服务器端就生成了token:
这是token的生成原理:
A=加密方式->转化为字符串->base64ur加密(符号:+转化"exp" :'timesta
B=用户信息(记录用户的id和创建/超时时间)->字符串->base64ur加密
C=(A+B)*HS535加密+加盐(加盐只有服务器知道盐的内容))*base64rul加案
注意:(A+B)均是base64url加密后的数据
服务器将生成的token,通过响应给浏览器
浏览器再次请求服务器时,会带着token
服务器,解析token,认证通过,把请求结果返回给用户端
服务器拿到token后,解密过程:
- 获取token,对token进行切割
- 对第二段B,进行base64url进行解密,获取payload信息,检测token是否超时
- 操作AB:将A 、B段拼接(AB均是base64url加密后的状态),再次通过HS535加密,假如得到一个CC字符串
- 操作C :需要把C进行base64url解密,结合加密过程中,C进行了额外一次的base64url加密(A+B)*base64url
- 对比:请求的token- 第三部分C == CC? 如果相等,校验通过. 如果有人修改任意内容,对比均不通过(因为加盐部分,对方不知道)
上面这个解密过程,可以好好看看,如果不懂的话欢迎留言
注意:
这种方法,如果想要破解token,或者伪造token,或者人为恶意延长token的时间,都验证不通过,除非能拿到"盐"