Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

java token生成和验证

作者:农村混血兒   发布日期:2026-03-06   浏览:47

import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;

public class TokenUtil {

    private static final String SECRET = "your_secret_key"; // 用于签名的密钥
    private static final String TOKEN_PREFIX = "Bearer ";
    private static final String HMAC_ALGO = "HmacSHA256";

    /**
     * 生成Token
     * @return 生成的Token字符串
     */
    public static String generateToken() {
        SecureRandom random = new SecureRandom();
        byte[] bytes = new byte[24];
        random.nextBytes(bytes);
        String token = Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
        return TOKEN_PREFIX + signToken(token);
    }

    /**
     * 签名Token
     * @param token 原始Token
     * @return 签名后的Token
     */
    private static String signToken(String token) {
        try {
            Mac mac = Mac.getInstance(HMAC_ALGO);
            SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET.getBytes(), HMAC_ALGO);
            mac.init(secretKeySpec);
            byte[] hash = mac.doFinal(token.getBytes());
            return token + "." + Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
        } catch (Exception e) {
            throw new RuntimeException("Failed to sign token", e);
        }
    }

    /**
     * 验证Token
     * @param token 待验证的Token
     * @return 如果Token有效返回true,否则返回false
     */
    public static boolean verifyToken(String token) {
        if (!token.startsWith(TOKEN_PREFIX)) {
            return false;
        }
        String tokenWithoutPrefix = token.substring(TOKEN_PREFIX.length());
        int dotIndex = tokenWithoutPrefix.lastIndexOf('.');
        if (dotIndex == -1) {
            return false;
        }
        String unsignedToken = tokenWithoutPrefix.substring(0, dotIndex);
        String signature = tokenWithoutPrefix.substring(dotIndex + 1);
        String expectedSignature = signToken(unsignedToken).split("\\.")[1];
        return signature.equals(expectedSignature);
    }

    public static void main(String[] args) {
        // 测试生成和验证Token
        String token = generateToken();
        System.out.println("Generated Token: " + token);

        boolean isValid = verifyToken(token);
        System.out.println("Is Token Valid: " + isValid);
    }
}

解释说明

  1. 生成Token:

    • 使用 SecureRandom 生成一个随机字节数组,并将其编码为Base64 URL安全格式。
    • 然后使用HMAC-SHA256算法对生成的Token进行签名,确保Token的完整性和真实性。
  2. 签名Token:

    • 使用HMAC-SHA256算法对Token进行签名,签名结果附加在原始Token后面,中间用.分隔。
  3. 验证Token:

    • 检查Token是否以 Bearer 开头。
    • 提取Token的签名部分和未签名部分。
    • 重新计算未签名部分的签名,并与提取的签名部分进行比较,如果一致则Token有效。
  4. 测试:

    • main 方法中生成一个Token并验证其有效性。

上一篇:java中什么是继承

下一篇:retainall java

大家都在看

java url decode

java判断是windows还是linux

java连接数据库的代码

java date类型比较大小

java djl

ubuntu 卸载java

es java api

java list 查找

java 解压rar

java读取excel中的图片

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站