【JavaWeb】Jwt令牌简单使用及代码示例

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负责非机密数据,故不需要加密。
  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值