jwt

构成
第一部分:头(header)第二部分:载荷 (payload)第三部分:(signature,json)签证 通过base64转码
第一部分:
声明:jwt
加密算法:HMAC SHA256
{
'typ':'JWT',
'alg':'HS256'
}
然后将其进行base64加密(可以对称解密)得到jwt的第一部分
第二部分:
iss:jwt签发者
sub:jwt所面向的用户
aud:接收jwt的一方
exp:jwt的过期时间,必须大于签发时间
nbf:定义在什么时间之前,该jwt是不可用的
lat:jwt的签发时间
jti:jwt的唯一身份标识,主要用来作为一次性的token,从而回避时序攻击
{
'sub':'1234567890',
'name':'ZYB',
'admin':true
}
然后将其进行base64加密得到jwt的第二部分
第三部分:
header(base64后的)
payload(base64后的)
secret
这个部分需要base64加密后的header和base64加密后的payload使用,连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了第三部分

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString,'secret');
注意:secret是保存在服务器的,jwt的签发生成也是在服务端,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去,,一但客户端得知这个secret,那就意味着客户端是可以自我签发jwt了
关于签发和核验jwt,使用Django REST framework JWT 扩展来完成

校验:
1、将token按.拆分为三段字符串,第一段 头加密字符串 一般不需要做任何处理
2、第二段 体加密,要反解出用户主键,通过主键从User表中就能得到登录用户,过期时间和设备信息都是安全信息,确保token没过期,且是同一设备来的
3、再用第一段+第二段+服务器安全吗(secret 不可逆md5),与第三段 签名字符串进行碰撞校验

posted @ 2020-12-10 17:07  zybyekai  阅读(125)  评论(0)    收藏  举报