sJWT令牌 全称:JSON Web Token (ww.jwt.io)
组成:
第一部分 : Header(头) , 记录令牌类型 , 签名算法等.
第二部分: Paylaoad(有效载荷) , 携带一些自定义信息,默认信息等. (不要往里面存敏感信息 账号 密码等)
第三部分 : Signature(签名) , 放置Token 被篡改 ,确保安全性 将header , payload 并加入指定秘钥 , 通过指定签名算法计算而来
Base64 : 是一种基于64个可打印字符(A-Z a-z 0-9 + /)来标识二进制数据的编码方式
本身数据是json格式,根据Base64编码,变成字符串 将经过编码的三个部分组成令牌即JWT令牌
JWT流程:
令牌生成: 登录成功后,生成JWT令牌并返回给前端
令牌检验: 在请求到达服务端后,对令牌进行统一拦截,校验
场景 : 登录认证
1.登录成功后, 服务端生成令牌,将令牌返回给浏览器存储
2.后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
生成 :
第一步 导入依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
//如果出现报错的情况,请导入下面的pom依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
第二步 生成令牌:
void Insert() {
//将令牌荷载添加进Map<String, Object>的键值对中
Map<String, Object> claims = new HashMap<>();
//存储信息
claims.put("id", "1");
claims.put("username", "tom");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "hevttc")//设置签名算法和秘钥
.setClaims(claims)//荷载 = 自定义内容
//根据当前的毫秒值加一个小时的时间作为过期时间 , 1000ms = 1s 一个小时 3600s
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) //口令过期时间
.compact();
System.out.println(jwt);
}
令牌破解:
因为令牌是使用Base64编码组成的字符串,所以使用Base64解码工具即可看到其中信息
假如刚刚生成的口令为:
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJleHAiOjE3MTg3MDE2MDQsInVzZXJuYW1lIjoidG9tIn0.sEDW0vEIMGzmiiUl_aBJaBTTu0owOcjHxbKT1sHTkp0
进行base64编码的解码(jwt官网也有),可以看到其中的信息,荷载中加了一个属性exp 它存储截止时间的毫秒值.
口令部分,经过了签名算法,算法不可逆,没办法反推信息 , 所以出现乱码
承接上文,为什么不要往荷载里面存敏感信息,因为荷载中的账户密码等敏感信息经过令牌破解会有泄露风险
口令校验 :
public static void parseJwt(String token){
Map<String, Object> claims = Jwts.parser()
//签名秘钥
.setSigningKey("hevttc")
//输入解析口令
.parseClaimsJws(token)
//获取荷载(自定义信息)
.getBody();
//将获取的信息输出
System.out.println(claims);
}
如果口令出现报错信息, 说明口令被篡改或者逾期