赞
踩
会话跟踪技术有三种:
令牌的形式有很多,我们使用的是功能强大的 JWT令牌。
JWT全称:JSON Web Token (官网:https://jwt.io/)
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
简洁:是指jwt就是一个简单的字符串。可以在请求参数或者是请求头当中直接传递。 自包含:指的是jwt令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求在jwt令牌中存储自定义的数据内容。如:可以直接在jwt令牌中存储用户的相关信息。 简单来讲,jwt就是将原始的json数据格式进行了安全的封装,这样就可以直接基于jwt在通信双方安全的进行信息传输了。
JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)
{"alg":"HS256","type":"JWT"}
- {
- "sub": "123456",
- // Subject (主题),用于标识JWT所代表的主体
- //这里指定了JWT令牌所代表的主体为ID为 "123456" 的用户。
- "username": "john.doe",
- "role": "user",
- "exp": 1677313600 // Expiration Time (过期时间)
- }
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥(仅在服务器端知道),通过指定签名算法计算而来。
签名的目的就是为了防jwt令牌被篡改,而正是因为jwt令牌最后一个部分数字签名的存在,所以整个jwt 令牌是非常安全可靠的。一旦jwt令牌当中任何一个部分、任何一个字符被篡改了,整个令牌在校验的时候都会失败,所以它是非常安全可靠的。
第一部分和第二部分是由base64编码生成的,而第三部分是使用指定的哈希算法对编码后的头部和负载进行签名生成签名部分。
创建JWT(签发令牌):
header.payload.signature
。传递JWT令牌:
验证JWT令牌:
如果JWT令牌在传输过程中被截获,攻击者可以利用这个令牌进行伪造访问。这就是为什么使用HTTPS来加密通信在JWT传输中非常重要。HTTPS可以确保通信的机密性和完整性,使得令牌在传输过程中难以被截获和篡改。
生成令牌的java代码:
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt</artifactId>
- <version>0.11.2</version> <!-- 使用最新版本 -->
- </dependency>
-
- import io.jsonwebtoken.Claims;
- import io.jsonwebtoken.JwtBuilder;
- import io.jsonwebtoken.Jwts;
- import io.jsonwebtoken.SignatureAlgorithm;
-
- import java.util.Date;
-
- //工具类:JwtUtil
- public class JwtUtil {
-
- // 假设这是服务器端的密钥
- private static final String SECRET_KEY = "your_secret_key";
-
- //生成密钥
- public static String generateJwtToken(String subject, long expirationMillis) {
- long nowMillis = System.currentTimeMillis();
- Date now = new Date(nowMillis);
-
- JwtBuilder builder = Jwts.builder()
- .setSubject(subject)
- .setIssuedAt(now)
- .setExpiration(new Date(nowMillis + expirationMillis))
- // 在负载部分添加自定义声明,例如用户名、角色等
- .claim("username", "john.doe")
- .claim("role", "user")
- .signWith(SignatureAlgorithm.HS256, SECRET_KEY);
-
- return builder.compact();
- }
-
- //解析密钥
- public static Claims parseJwtToken(String jwtToken) {
- JwtParser parser = Jwts.parser().setSigningKey(SECRET_KEY);
- return parser.parseClaimsJws(jwtToken).getBody();
- }
-
- }
-
-
-
获得令牌的时候调用工具类然后传参:
- public static void main(String[] args) {
- // 生成JWT令牌
- long expirationMillis = 3600000; // 1小时
- String jwtToken = generateJwtToken("subject", expirationMillis);
- System.out.println("Generated JWT Token: " + jwtToken);
-
- // 解析JWT令牌
- Claims claims = parseJwtToken(jwtToken);
- System.out.println("Subject: " + claims.getSubject());
- System.out.println("Username: " + claims.get("username"));
- System.out.println("Role: " + claims.get("role"));
- }
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。