JAVA中使用JWT算法加解密方案

1.JWT简介

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。

    详细介绍:https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=pc

2.前提

    2.1所需jar包

		<dependency>
			<groupId>com.auth0</groupId>
			<artifactId>java-jwt</artifactId>
			<version>3.8.1</version>
		</dependency>

    2.2可能出现问题

         java.lang.NoClassDefFoundError:com/fasterxml/jackson/databind/ObjectMapper

        此信息为spring和jackson相关版本不兼容,将本地jsckson版本升到2.7.5以上或者更高即可(可与旧版本同时存在)

        相关依赖如下(我只升级了jackson-core和jackson-databind就可以了):

        <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
             <version>2.7.5</version>
       </dependency>
       <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
             <version>2.7.5</version>
       </dependency>
       <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
             <version>2.7.5</version>
       </dependency>

       <dependency>
             <groupId>org.codehaus.jackson</groupId>
             <artifactId>jackson-mapper-asl</artifactId>
             <version>1.9.4</version>
       </dependency>
       
       <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.4</version>
       </dependency>

 

Spring为4.3.2兼容jackson版本为2.7.5和更高版本,相关依赖如下:

3.JWT在JAVA中应用方案

   以下为JWT测试类,有详细加解密代码。

package cn.bxn.test;

import java.util.Date;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JWTTest {
	/**
	* 生成加密后的token
	* @param username 用户名
	* @param name  姓名
	* @return 加密后的token
	*/
	public static String getToken(String username, String category) {
		String token = null;
		try {
			Date expiresAt = new Date(System.currentTimeMillis() + 24L * 60L * 3600L * 1000L);
			token = JWT.create().withIssuer("auth0").withClaim("username", username).withClaim("category", category)
					.withExpiresAt(expiresAt)
					// 使用了HMAC256加密算法。
					// mysecret是用来加密数字签名的密钥。
					.sign(Algorithm.HMAC256("qingningtest20191224"));
		} catch (JWTCreationException exception) {
			// Invalid Signing configuration / Couldn't convert Claims.
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return token;
	}

	/**
	 * 解密
	 * @author 张超
	 *
	 */
	/**
	 * 先验证token是否被伪造,然后解码token。
	 * @param token 字符串token
	 * @return 解密后的DecodedJWT对象,可以读取token中的数据。
	 */
	public static DecodedJWT deToken(final String token) {
		DecodedJWT jwt = null;
		try {
			// 使用了HMAC256加密算法。
			// mysecret是用来加密数字签名的密钥。
			JWTVerifier verifier = JWT.require(Algorithm.HMAC256("qingningtest20191224")).withIssuer("auth0").build();// Reusable
																														// verifier
																														// instance
			jwt = verifier.verify(token);
		} catch (JWTVerificationException exception) {
			// Invalid signature/claims
			exception.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return jwt;
	}

	public static void main(String[] args) {
		// 生成token
		String token = JWTTest.getToken("888888", "4");
		// 打印token
		System.out.println("token: " + token);
		// 解密token
		DecodedJWT jwt = JWTTest.deToken(token);
		System.out.println("username: " + jwt.getClaim("username").asString());
		System.out.println("category:     " + jwt.getClaim("category").asString());
		System.out.println("过期时间:      " + jwt.getExpiresAt());
	}
}

        

Java使用JWT(JSON Web Token)进行加密和解密是一种常见的身份验证和授权机制。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 1. 头部(Header):包含了算法和令牌类型等信息,通常使用Base64编码表示。 2. 载荷(Payload):包含了要传输的数据,比如用户ID、角色等信息,同样使用Base64编码表示。 3. 签名(Signature):使用私钥对头部和载荷进行签名,以确保数据的完整性和真实性。 下面是使用Java进行JWT加密和解密的步骤: 1. 导入相关依赖:在项目的pom.xml文件添加以下依赖: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> ``` 2. 创建JWT生成器:使用`Jwts.builder()`创建一个JWT生成器对象。 ```java JwtBuilder builder = Jwts.builder(); ``` 3. 设置头部和载荷信息:使用`setHeader()`和`setClaims()`方法设置头部和载荷信息。 ```java builder.setHeader(headerMap); builder.setClaims(claimsMap); ``` 4. 设置签名:使用`signWith()`方法设置签名算法和私钥。 ```java builder.signWith(SignatureAlgorithm.HS256, secretKey); ``` 5. 生成JWT使用`compact()`方法生成最终的JWT字符串。 ```java String jwt = builder.compact(); ``` 6. 解密JWT使用`Jwts.parser()`创建一个JWT解析器对象,并使用`setSigningKey()`方法设置公钥或密钥。 ```java Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody(); ``` 以上是使用Java进行JWT加密和解密的基本步骤。需要注意的是,生成JWT时需要使用私钥进行签名,解密JWT时需要使用公钥或密钥进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低调D树苗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值