jwt 加密和解密demo
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。 导入jar <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.10.5</version> </dependency>
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.10.5</version> <scope>runtime</scope> </dependency>
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.10.5</version> <scope>runtime</scope> </dependency>
JWTTest.java
代码语言:javascript复制package com.example.demo.jwt;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
import java.util.UUID;
/**
* JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。
* https://jwt.io/
* https://www.cnblogs.com/moonlightL/p/10020732.html
*/
public class JWTTest {
public static void main(String[] args) {
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
System.out.println("=============创建 JWT===========");
Date now = new Date();
JwtBuilder builder= Jwts.builder()
.setId(UUID.randomUUID().toString()) // 载荷-标准中注册的声明
.setSubject("admin") // 载荷-标准中注册的声明
.setIssuedAt(now) // 载荷-标准中注册的声明,表示签发时间
.claim("id", "123456") // 载荷-公共的声明
.claim("name", "MoonlightL") // 载荷-公共的声明
.claim("sex", "male") // 载荷-公共的声明
.signWith(key); // 签证
String jwt = builder.compact();
System.out.println("生成的 jwt :" jwt);
System.out.println("=============解析 JWT===========");
try {
Jws<Claims> result = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt);
// 以下步骤随实际情况而定,只要上一行代码执行不抛异常就证明 jwt 是有效的、合法的
Claims body = result.getBody();
System.out.println("载荷-标准中注册的声明 id:" body.getId());
System.out.println("载荷-标准中注册的声明 subject:" body.getSubject());
System.out.println("载荷-标准中注册的声明 issueAt:" body.getIssuedAt());
System.out.println("载荷-公共的声明的 id:" result.getBody().get("id"));
System.out.println("载荷-公共的声明的 name:" result.getBody().get("name"));
System.out.println("载荷-公共的声明的 sex:" result.getBody().get("sex"));
} catch (JwtException ex) { // jwt 不合法或过期都会抛异常
ex.printStackTrace();
}
}
}
JWTTest2.java
代码语言:javascript复制package com.example.demo.jwt;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
import java.util.UUID;
/**
* 报错信息解决:
* io.jsonwebtoken.security.WeakKeyException: The signing key's size is 96 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HS256 MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys class's 'secretKeyFor(SignatureAlgorithm.HS256)' method to create a key guaranteed to be secure enough for HS256. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.
* 将JWS_SECRET key的长度加长。
*/
public class JWTTest2 {
private static final String JWS_SECRET = "fsfsfsfs1211212fdsfsfsdfsfsfsfsfsfaaaaeweweewsssssssssssssss";
private static final String JWS_BODY_KEY = "jwtTxt";
public static void main(String[] args) {
String jwt = "";
try {
System.out.println("=============创建 JWT===========");
String json = "你好中国2022"; //可以考虑存储为json字符串
SignatureAlgorithm sa = SignatureAlgorithm.HS256;
byte[] ksBytes = DatatypeConverter.parseBase64Binary(JWS_SECRET);
Key signKey = new SecretKeySpec(ksBytes, sa.getJcaName());
JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
.claim(JWS_BODY_KEY, json)
.signWith(sa, signKey);
jwt = builder.compact();
System.out.println("生成的 jwt :" jwt);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("=============解析 JWT===========");
try {
Jws<Claims> jws = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(JWS_SECRET)) .parseClaimsJws(jwt.trim());
Claims body = jws.getBody();
Object jbk = body.get(JWS_BODY_KEY);
System.out.println("content=" jbk.toString().trim());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行效果图及验证:
访问地址: https://jwt.io/#debugger