基于JWT实现Token的加密和解密

JWT生成的Token大概是下图这样的:

在这里插入图片描述
它分为三个部分,分别是:

  1. 头部(header):带有类型和加密算法信息
  2. 载荷(payload):带有过期时间、签发者和自定义信息
  3. 签证(signature):首先将 header 和 payload 信息进行 Base64 编码,然后将他们进行带盐加密得到密文,最后将这密文再进行 Base64 编码得到最终的 signature。

需要的依赖包

	<!-- Token  -->
	<dependency>
		<groupId>com.auth0</groupId>
		<artifactId>java-jwt</artifactId>
	</dependency>

实例

public class TokenTest {

    /**
     * SALT:盐,或称密钥。加密使用,需要服务端保管好
     */
    private static final String SALT = "029ef05131b5501f319ae490354df5c9a23be01e3c1d40c79d5d52fe992dbe";

    /**
     * 创建 Token
     * @param userName 用户名,用作于接口过滤。可根据具体的业务进行设置
     * @return Token 字符串
     */
    public static String createToken(String userName){

        // 签发时间
        Date issueDate = new Date();

        // 过期时间
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE, 480); // 8 小时过期
        Date expireDate = nowTime.getTime();

        Map<String, Object> headerMap = new HashMap<>();
        headerMap.put("alg", "HMAC256"); // 声明算法
        headerMap.put("typ", "JWT"); // 声明类型

        return JWT.create()
                .withHeader(headerMap)  // header段,带有算法信息和类型信息
                .withExpiresAt(expireDate) // payload段,设置过期时间
                .withIssuedAt(issueDate) //payload段,设置签发时间
                .withIssuer("HyugaNeji") // payload段,设置签发者
                .withClaim("name", userName) // payload段,自定义信息
                .sign(Algorithm.HMAC256(SALT)); // signature段,进行加盐加密
    }

    /**
     * 验证 Token
     * @param token token 字符串
     * @return 这里我选择取回 payload 段的信息,因为里面有自定义信息,我可以拿来处理业务逻辑
     */
    public static Map<String, Claim> verifyToken(String token) {
        if(token != null){
            // 解密也需要该 salt,所以它很重要,不要泄露
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SALT)).build();
            DecodedJWT jwt = verifier.verify(token);

            if(SystemConstant.ISSUER.equals(jwt.getIssuer())){
                return jwt.getClaims();
            }
        }
        return null;
    }

    /**
     * 模拟接口认证
     */
    public static void main(String[] args) {

        // 1. 取前端带过来的 token 信息。现在假设这就是前端带上来的数据
        String token = "";

        // 2. 验证 Token
        boolean result = false;
        // 取得 payload 段的信息
        Map<String, Claim> claimMap = TokenTest.verifyToken(token);
        if(claimMap != null){
            // 取出里面的用户名
            String userName = claimMap.get("name").asString();
            // 检查该用户名是否存在,存在就放行,不存在就返回指定的信息
            result = UserService.findAdminByName(userName) != null;
        }

        // 3. 处理结果
        if(result){
            // 放行
        }else {
            // 返回指定错误信息
        }
    }
}


技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。


  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证的开放标准(RFC 7519)。它是基于JSON(JavaScript Object Notation)格式的数据结构,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 JWT加密/解密过程可以采用对称加密或非对称加密。对称加密使用同一个密钥进行加密解密,而非对称加密使用公钥加密,私钥解密。 以下是JWT使用对称加密和非对称加密加密/解密过程: 1. 对称加密 加密过程: 1)将头部和载荷进行Base64编码,得到第一部分:Base64UrlEncode(header) + "." + Base64UrlEncode(payload)。 2)使用密钥对第一部分进行加密。 3)对加密后的结果进行Base64UrlEncode,得到第三部分:Base64UrlEncode(signature)。 解密过程: 1)将JWT字符串按照“.”分割成三部分。 2)使用密钥对第一部分进行解密。 3)对解密后的结果进行Base64解码,得到头部和载荷。 4)对解密后的结果和密钥进行签名验证。 2. 非对称加密 加密过程: 1)将头部和载荷进行Base64编码,得到第一部分:Base64UrlEncode(header) + "." + Base64UrlEncode(payload)。 2)使用私钥对第一部分进行签名。 3)对签名后的结果进行Base64UrlEncode,得到第三部分:Base64UrlEncode(signature)。 解密过程: 1)将JWT字符串按照“.”分割成三部分。 2)对第一部分和第三部分进行Base64解码,得到头部、载荷和签名。 3)使用公钥对签名进行验证。 4)验证通过后,得到解密后的头部和载荷。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值