spring boot项目如何通过JWT工具生成token以及逆向解密token?

一.什么是JWT?

JWT 是一个开放标准,它定义了⼀种⽤于简洁,自包含的用于通信双方之间以 JSON 对象的
形式安全传递信息的方法。 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名,简单来
说: 就是通过⼀定规范来⽣成token,然后可以通过解密算法逆向解密token,这样就可以获取
用户信息

二.首先需要在pom.xml文件中添加相应的依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

三.在Utils包中建立JWTSUtils类实现生成token

/**
 * JWT工具类
 * 注意点:
 * 1.生成的token是可以通过base64进行解密出明文信息
 * 2.base64进行解密出的明文信息,修改再进行编码,则会解密失败
 * 3.无法作废已经颁布的令牌token,除非改密钥
 */
public class JWTUtils {
    /**
     * 过期时间为一周
     */
    private static final long Expire=60000*60*24*7;
    /**
     * 密钥
     */
    private static final String secret="xdclass.net168";
    /**
     * 令牌前缀
     */
    private static final String Token_PreFix="xdclass";
    /**
     * subject主题
     */
    private static final String SUBJECT="xdclass";

    /**
     * 根据用户信息生成令牌
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){
        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img", user.getHeadImg())
                .claim("id", user.getId())
                .claim("name", user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + Expire))
                .signWith(SignatureAlgorithm.HS256, secret).compact();
        token=Token_PreFix+token;
        return token;
    }

注解:

JWT格式组成 头部、负载、签名
header+payload+signature
头部:主要是描述签名算法
负载:主要描述是加密对象的信息,如⽤户的id等,也可以加些规范⾥⾯的东⻄,如iss
签发者,exp 过期时间,sub ⾯向的⽤户
签名:主要是把前⾯两部分进⾏加密,防⽌别⼈拿到token进⾏base解密后篡改token
代码解释:.claim("head_img", user.getHeadImg()) .claim("id", user.getId()).claim("name", user.getName())链式调用在负载里注入图片信息,id,用户名。
                  
         setIssuedAt(new Date())设置开始时间
         setExpiration(new Date(System.currentTimeMillis() + Expire))设置过期时间
         signWith(SignatureAlgorithm.HS256, secret)用私钥对签名算法进行加密
四.通过Jwts逆向解密token
public static Claims checkJWT(String token){
        try{
            final Claims claims = Jwts.parser().setSigningKey(secret)
                    .parseClaimsJws(token.replace(Token_PreFix, ""))
                    .getBody();
            return claims;
        }catch (Exception e){
            return null;
        }
    }
setSigningKey(secret)通过私钥对token进行解密
五.关于JWT客户端存储
   可以存储在cookie,localstorage和sessionStorage⾥⾯
 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519)。它是一种轻量级的安全传输方式,用于在网络应用间传递声明信息。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 头部包含了关于令牌的元数据和加密算法的信息,通常由两部分组成:令牌类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA)。 载荷是JWT的主要内容,包含了一些声明信息,如用户ID、角色、权限等。载荷可以自定义,但建议只包含一些非敏感的信息,因为JWT是可解码的。 签名是对头部和载荷进行加密生成的,用于验证JWT的真实性和完整性。签名需要使用头部中指定的算法和密钥进行生成,接收方可以通过验证签名来确保JWT没有被篡改。 生成JWT token的过程如下: 1. 创建一个包含所需声明信息的JSON对象。 2. 使用Base64编码头部和载荷,形成两个字符串。 3. 将两个字符串用点号连接起来,形成一个未签名的JWT。 4. 使用指定的算法和密钥对未签名的JWT进行签名,生成签名字符串。 5. 将签名字符串添加到未签名的JWT末尾,形成最终的JWT token。 验证JWT token的过程如下: 1. 将接收到的JWT token按点号分割为头部、载荷和签名三部分。 2. 使用相同的算法和密钥对头部和载荷进行签名,生成一个新的签名字符串。 3. 将新生成的签名字符串与接收到的签名进行比较,如果相同,则说明JWT token是有效的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值