Jwt令牌介绍
Jwt令牌主要用于登录操作中,常用来进行身份认证
jwt令牌分为三个部分(不同部分之间用点分割):
- 由base64编码的头部信息,其中储存着Jwt所使用的摘要算法
- 由base64编码的中间部分用户自定义信息,用户可以在中间部分进行数据传送
- 对第一部分和第二部分的摘要信息(摘要算法使用第一部分所说明的算法)
三部分的示例:
eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsImV4cCI6MTcwOTM4OTExMywidXNlcm5hbWUiOiJqaW55b25nIn0.uhrPL_fN_DI6jl25YecbGid7YyIq4jBhQYLbWNUltdg
通过base64解析后的结果:
{"alg":"HS256"}
{"name":"金庸","id":1,"exp":1709389113,"username":"jinyong"}
.���|���9v凜lh�팈����mcT��`
就长这样,在格式上,前面两部分用json传送,最后一部分为摘要
注意:
这里使用的不是加密算法而是摘要算法,攻击者可以看到Jwt令牌中所传递的值,但是由于摘要算法的存在,攻击者不能修改或者伪造值。不可用于传输机密数据!
代码实现
public class JWTUtils {private static Long expire = 43200000L;private static String key = "zhang";// 生成Gwt令牌public static String genGWT(Map<String, Object> claims) {String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}// 解析令牌public static Map<String, Object> parseJwt(String jws) {Map<String, Object> claims = Jwts.parser().setSigningKey(key).parseClaimsJws(jws).getBody();return claims;}}
代码简单解释
- signWith:设置加密算法和秘钥
- setClaims:设置中间传送内容
- setExpiration:设置令牌过期时间
- compact:这个不知道干啥的,大佬看见之后麻烦在评论区解答一下~
- setSigningKey:传入秘钥
- parseClaimsJws:传入字符串(注意这里是jws,而不是jwt, JSON Web String)
- getBody:得到中间自定义的数据
写在后面
- 关于算法:博主本身就是学安全的,对这个比较感兴趣,这里的算法为对称算法,而不是公钥算法(非对称)
- 为什么不把数据加密,而是进行摘要?:机密数据交给post方式进行传输,post有对应的加密,jwt负责非机密数据,故不需要加密。