Java JWT 加密解密
简介
JWT(JSON Web Token)是一个开放标准(RFC 7519),用于在网络应用环境中以安全的方式传递声明。它主要由三部分组成:头部(Header)、有效载荷(Payload)和签名(Signature)。JWT被广泛用于身份验证、信息共享等场景,特别是在微服务架构中,因其无状态的特性而受到青睐。
JWT 结构
组件 | 说明 |
---|---|
Header | 包含令牌类型及签名算法 |
Payload | 存储用户信息及其他声明 |
Signature | 用于验证发送者身份及数据完整性 |
JWT的结构如图所示:
graph TD;
A[Header] --> B[Payload]
B --> C[Signature]
JWT 加密和解密流程
- 创建JWT:用基本信息生成JWT。
- 发送JWT:在HTTP请求中携带JWT。
- 验证JWT:服务器接收请求时,验证JWT的有效性。
- 解密JWT:从JWT中提取用户信息。
Java实现示例
以下是一个使用Java生成和解析JWT的示例。我们需要用到jjwt
库,可以通过Maven或Gradle引入。
Maven依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建JWT
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private String secretKey = "mySecretKey";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 设置过期时间
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
解密JWT
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public class JwtUtil {
private String secretKey = "mySecretKey";
public String extractUsername(String token) {
return extractAllClaims(token).getSubject();
}
private Claims extractAllClaims(String token) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody();
}
}
使用示例
public class JwtExample {
public static void main(String[] args) {
JwtUtil jwtUtil = new JwtUtil();
// 生成 JWT
String token = jwtUtil.generateToken("user123");
System.out.println("生成的 JWT: " + token);
// 解密 JWT
String username = jwtUtil.extractUsername(token);
System.out.println("提取的用户名: " + username);
}
}
总结
JWT在现代应用中扮演着重要角色,特别是在分布式系统中,其无状态的特性帮助我们提升了系统的可扩展性与安全性。Java的jjwt
库使得生成和解析JWT变得容易,为开发者提供了便利。
在实际应用中,务必注意密钥的安全管理和JWT存储的位置。同时,根据业务需求设定合理的有效期,以降低安全风险。希望本文能够帮助你更好地理解Java中的JWT加密解密。