JWT加密以及解密工具类(简洁版)

27 篇文章 0 订阅
21 篇文章 1 订阅

简介

JWT,JSON WEB TOKEN,是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范;

该工具类可快速实现jwt秘钥的加密和解密,适用于初学者快速入手;

项目实践

package com.sixmonth.micro.serv.page.common.jwt;

import java.util.Date;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import com.alibaba.fastjson.JSONObject;
import com.sixmonth.micro.serv.common.util.UUIDUtils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;

/**
 * JWTUtils工具类,生成jwt和解析jwt
 * JSON WEB TOKEN 结构组成:
 * (1)Header(头部):包含加密算法,通常直接使用 HMAC SHA256
 * (2)Payload(负载):存放有效信息,比如消息体、签发者、过期时间、签发时间等
 * (3)Signature(签名):由header(base64后的)+payload(base64后的)+secret(秘钥)三部分组合,然后通过head中声明的算法进行加密
 * @author sixmonth
 * @date 2019年3月20日
 *
 */
public class JWTUtils {
	
	static String SECRETKEY = "KJHUhjjJYgYUllVbXhKDHXhkSyHjlNiVkYzWTBac1Yxkjhuad";

	/**
	 * 由字符串生成加密key
	 * 
	 * @return
	 */
	public static SecretKey generalKey(String stringKey) {
		byte[] encodedKey = Base64.decodeBase64(stringKey);
		SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
		return key;
	}

	/**
	 * 创建jwt
	 * @param id 唯一id,uuid即可
	 * @param subject json形式字符串或字符串,增加用户非敏感信息存储,如用户id或用户账号,与token解析后进行对比,防止乱用
	 * @param expirationDate  生成jwt的有效期,单位秒
	 * @return jwt token
	 * @throws Exception
	 */
	public static String createJWT(String uuid, String subject, long expirationDate) throws Exception {
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
		long nowMillis = System.currentTimeMillis();
		Date now = new Date(nowMillis);
		SecretKey key = generalKey(SECRETKEY);
		JwtBuilder builder = Jwts.builder().setIssuer("").setId(uuid).setIssuedAt(now).setSubject(subject)
				.signWith(signatureAlgorithm, key);
		if (expirationDate >= 0) {
			long expMillis = nowMillis + expirationDate*1000;
			Date exp = new Date(expMillis);
			builder.setExpiration(exp);
		}
		return builder.compact();
	}

	/**
	 * 解密jwt,获取实体
	 * @param jwt
	 */
	public static Claims parseJWT(String jwt) throws ExpiredJwtException, UnsupportedJwtException,
			MalformedJwtException, SignatureException, IllegalArgumentException {
		SecretKey key = generalKey(SECRETKEY);
		Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt).getBody();
		return claims;
	}

	/**
	* 实例演示
	*/
	public static void main(String[] args) {
		try {
			JSONObject subject = new JSONObject(true);
			subject.put("tem", "哈哈哈");
			subject.put("userName", "sixmonth");
			String token = createJWT(UUIDUtils.getUUID(), subject.toJSONString(), 10);//10秒过期
			//System.out.println(token);
			Claims claims = parseJWT(token);
			System.out.println("解析jwt:"+claims.getSubject());
			JSONObject tem = JSONObject.parseObject(claims.getSubject());
			System.out.println("获取json对象内容:"+tem.getString("userName"));	
			System.out.println(claims.getExpiration()+"///"+claims.getExpiration().getTime());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

添加依赖

<!-- jjwt支持 -->
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.7.0</version>
</dependency>

<!--commons-codec -->
<dependency>
	<groupId>commons-codec</groupId>
	<artifactId>commons-codec</artifactId>
</dependency>

总结

实践出真知,自己动手,丰衣足食!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值