token编码过程:第一部分:
json转换为字符串,进行:base64url加密(JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。)
eyjhbgcioijiuzi1niisinr5CCI6ikpxvcj9header : algorithm tokentype { ' alg ' : ' hs 256 ',##加密算法,散列256可以反过来求解
json将转换为字符串并进行:base64url加密。 本质是替换base64加密中的特定符号。
Payload节也是一个JSON对象,用于存储实际需要传递的数据。 JWT规定了7个官方字段,并提供了选项。
ISS(Issuer ) :发行者
扩展时间(exp ) :过期
次主题:主题
Aud (身份) :参与者
非基本(nbf ) :生效时间
IAT(issuedat ) :发行时间
JTI(jwtid ) :编号
除了官方字段外,还可以在此部分定义专用字段
PAYLOAD:DATA{ (自定义值:可以是其他信息(请勿包含重要信息)。 base64url ) )可以相反。 ) sub': '1234567890 )、##主题' name ' : ' John doe ' # #专用字段' iat': 1516239022 ##发布时间} eyjzdwith
第一,用“.”连接两部分的密文,进行HS256加密求解,选择secret base64 encoded后,用base64加密整体
verifysignaturehmacsha 256 (base64urlencode (header ).' base64 urlencode ),your-256-bit-secret ##键是盐的值
第二部分:用户访问时携带token,在后端检查token :
http://www.Sina.com/eyjhbgcioijiuzi1niisinr5CCI6ikpxvcj9. eyjzdwiioiixmjm0nty3odkwiibmftzsi6ikpvag4grg9liwia wf0ijoxnte
第三部分:
PAYLOAD:DATA{ (自定义值:可以是其他信息(请勿包含重要信息)。 base64url ) )可以相反。 ) sub': '1234567890 )、##id 'name': 'John Doe
验证并比较用户持有的HS256密文和服务端从用户传递给token的第一、二部分生成的HS256密文
(1)密文)将第3部分的字符串解密为回复用户时的HS256的密文
)2)用"."连接第一、二部分密文,然后进行HS256加密盐
然后,比较(1)、(2)
可能出现的安全隐患:
1 .如果用户修改了第二部分密文的超时时间,在验证token时,服务端生成的第三部分密文与用户拥有的第三部分密文不同
2 .如果用户同时修改了第一部分和第二部分的密文和第三部分的密文:此时HS256加密同时加盐的重要性就体现出来了。 因为服务端在生成第三部分的密文时会加上盐的值。
3 .这个盐的值很重要。