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);
}
}
生成Token:
SecureRandom 生成一个随机字节数组,并将其编码为Base64 URL安全格式。签名Token:
.分隔。验证Token:
Bearer 开头。测试:
main 方法中生成一个Token并验证其有效性。上一篇:java中什么是继承
下一篇:retainall java
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站