全网免费Token的生成和解析,第一期

一、Token令牌的作用

  1. 身份验证和授权:在网络安全领域,令牌经常被用作身份验证和授权的手段。例如,在OAuth(开放授权)协议中,令牌被用来代表用户账户的权限,使得第三方应用程序可以在用户的许可下访问特定资源,而无需获取用户的用户名和密码。

  2. 会话管理:在Web应用中,会话令牌常被用来识别和管理用户的会话。每当用户登录系统时,服务器会生成一个唯一的会话令牌并发送给客户端。客户端在后续的请求中都会携带这个令牌,以便服务器识别用户的身份。

  3. 防止跨站请求伪造(CSRF):令牌也可以用来防止跨站请求伪造攻击。在这种情况下,服务器会为每个会话生成一个唯一的令牌,并将其嵌入到Web页面中。当用户提交表单或进行其他交互操作时,浏览器会自动将这个令牌发送给服务器,服务器通过检查令牌的有效性来确保请求是合法的。

  4. 区块链和加密货币:在区块链和加密货币领域,Token(令牌)通常指代具有某种价值或功能的数字资产。例如,以太坊网络上的ERC20 Token,它可以代表一种货币、一份股权、一个投票权等。

  5. API限流:在一些API服务中,为了防止恶意使用或者过度使用,会使用令牌桶算法进行限流,其中的“令牌”就是控制请求频率的单位。

二、选择token加密算法

  1. 选择一个适合的加密算法:例如,常见的加密算法包括HMAC、JWT、OAuth等。选择一个安全性高、适用于你的应用场景的加密算法。

  2. 生成Payload:Payload是Token中存储的信息,可以包含用户ID、角色、权限等信息。根据需要构建一个包含必要信息的JSON对象或其他格式的数据。

  3. 添加时间戳和过期时间:为了增加安全性和控制Token的有效期,通常在Payload中添加一个时间戳字段表示生成Token的时间,并设置一个过期时间。

  4. 使用密钥进行签名:使用选定的加密算法和一个密钥对生成的Payload进行签名。这个密钥只有服务器端知道,用于验证Token的真实性和完整性。

  5. 生成Token:将签名后的Payload和其他必要信息(如时间戳等)组成Token字符串。

三、本篇一JWT为例(实操)

3.1导包

以下是JWT-java MAVEN 的坐标

<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>

3.2JWT官网

https://jwt.io/ (放心点击)

四、Token工具类


4.1创建TokenUtils类

4.1.1实现密钥生成

public class TokenUtils {
    private static final int KEY_LENGTH = 32; // 密钥长度为32字节(256位)

    /*
     * 生成随机密钥
     */
    public static String generateRandomKey() {
        byte[] keyBytes = new byte[KEY_LENGTH];
        SecureRandom secureRandom = new SecureRandom();
        secureRandom.nextBytes(keyBytes);
        return Base64.getEncoder().encodeToString(keyBytes);
    }

密钥必须为32字节,这里采用 base64 解析。

4.1.2实现密钥转SecretKey对象 

/*
     * 根据密钥生成SecretKey对象
     */
    private SecretKey getSecretKey(String secretKey) {
        byte[] keyBytes = Base64.getDecoder().decode(secretKey);
        return Keys.hmacShaKeyFor(keyBytes);
    }

4.1.3实现生成token

/*
     * 生成Token
     */
    public String generateToken(String secretKey, String... texts) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + 3600000 * 24); // Token有效期为一天

        JwtBuilder jwtBuilder = Jwts.builder()
                .setIssuedAt(now)
                .setExpiration(expirationDate)
                .signWith(getSecretKey(secretKey));

        for (int i = 0; i < texts.length; i++) {
            jwtBuilder.claim("myToken" + i, texts[i]);
        }

        return jwtBuilder.compact();
    }

token设置为有效期1天,采用多参数传入String…texts, for循环 将 数据参数 传入 jwt生成token。

4.1.4实现解析token

/*
     * 解析Token
     */
    public String[] parseToken(String token, String secretKey) {
        try {
            Jws<Claims> claimsJws = Jwts.parserBuilder()
                    .setSigningKey(getSecretKey(secretKey))
                    .build()
                    .parseClaimsJws(token);

            // 获取有效载荷中的hrToken
            List<String> myTokens = new ArrayList<>();
            int i = 0;
            while (true) {
                String myToken = claimsJws.getBody().get("myToken" + i, String.class);
                if (myToken == null) {
                    break;
                }
                myTokens.add(myToken);
                i++;
            }

            return myTokens.toArray(new String[0]);
        } catch (Exception e) {
            // 解析失败,返回null或者抛出异常
            return null;
        }
    }

4.2测试代码main方法

public class TestToken2 {
    public static void main(String[] args) {
        TokenUtils tokenUtils = new TokenUtils();
        String randomKey = tokenUtils.generateRandomKey();
        System.out.println("随机密钥是" + randomKey);
        
        String token = tokenUtils.generateToken(randomKey, "a=16163","b=+@qq.com","c=8585","d=685896");
        System.out.println("token为" + token);
        
        String[] parsedTokens = tokenUtils.parseToken(token, randomKey);
        if (parsedTokens != null) {
            for (String parsedToken : parsedTokens) {
                System.out.println("解析后的token为" + parsedToken);
            }
        } else {
            System.out.println("无法解析token");
        }
    }

五、关注我

第二期 解答Token解析的格式,采用 map集合注入参数 生成token,解析为 一般格式 和 json 格式。敬请期待!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值