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 加密和解密流程

  1. 创建JWT:用基本信息生成JWT。
  2. 发送JWT:在HTTP请求中携带JWT。
  3. 验证JWT:服务器接收请求时,验证JWT的有效性。
  4. 解密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加密解密。