柚子快報激活碼778899分享:Java JWT加密、解密
柚子快報激活碼778899分享:Java JWT加密、解密
介紹
????????JSON Web 令牌 (JWT) 是一種開放標(biāo)準(zhǔn) (RFC 7519),它定義了一種緊湊且獨立的方式,用于作為 JSON 對象在各方之間安全地傳輸信息。由于此信息已進行數(shù)字簽名,因此可以對其進行驗證和信任。可以使用密鑰(使用?HMAC?算法)或使用?RSA?或?ECDSA?的公鑰/私鑰對對 JWT 進行簽名。
1、引入包
2、簽名算法
/**
* 簽名算法
*/
private static final SignatureAlgorithm signatureAlgorithm;
3、靜態(tài)實例化值
/**
* 靜態(tài)默認值
*/
static {
signatureAlgorithm = SignatureAlgorithm.HS512;
}
4、加密
/**
* 前三個參數(shù)為自己用戶token的一些信息比如id,權(quán)限,名稱等。不要將隱私信息放入(大家都可以獲取到)
*
* @param map 參數(shù)
* @param base64Security 密鑰
* @return 返回結(jié)果
*/
public static String createJwt(Map
//添加構(gòu)成JWT的參數(shù)
JwtBuilder builder = builderJwt(map, base64Security);
//生成JWT token
return builder.compact();
}
/**
* 前三個參數(shù)為自己用戶token的一些信息比如id,權(quán)限,名稱等。不要將隱私信息放入(大家都可以獲取到)
*
* @param map 參數(shù)
* @param base64Security 密鑰
* @param expiration 過期時間
* @return 返回結(jié)果
*/
public static String createJwt(Map
//添加構(gòu)成JWT的參數(shù)
JwtBuilder builder = builderJwt(map, base64Security);
builder.setExpiration(new Date(expiration));
//生成JWT
return builder.compact();
}
/**
* 構(gòu)建 jwt
*
* @param map 值
* @param base64Security 密鑰
* @return 返回結(jié)果
*/
private static JwtBuilder builderJwt(Map
return Jwts.builder().setHeaderParam("typ", "JWT")
.setClaims(map)
//估計是第三段密鑰
.signWith(signatureAlgorithm, base64Security.getBytes());
}
5、解密
/**
* 解密
*
* @param jsonWebToken token
* @param base64Security 密鑰
* @return 返回結(jié)果
*/
public static Claims parseJwt(String jsonWebToken, String base64Security) {
try {
Claims claims = Jwts.parser()
.setSigningKey(base64Security.getBytes())
.parseClaimsJws(jsonWebToken).getBody();
return claims;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
6、檢查token
/**
* 檢查token
*
* @param jwtToken token
* @param base64Security base64安全性
* @param userAgent 用戶代理
* @return 返回 redis token
* @throws Exception 異常信息
*/
public static String checkToken(String jwtToken, String base64Security, String userAgent) throws GlobalException {
String token;
try {
Claims claims = parseJwt(jwtToken, base64Security);
long effective = IntegerConsts.TWENTY_FOUR * IntegerConsts.SIXTY * IntegerConsts.SIXTY;
Long time = ConvertUtils.convertLong(claims.get(BusinessConsts.TIME));
if (time <= IntegerConsts.ZERO) {
time = ConvertUtils.convertLong(claims.get(BusinessConsts.EXP));
}
// 驗證 token 是否過期
LocalDateTime localDateTime = LocalDateUtils.timestampToLocalDateTime(time)
.plusSeconds(effective);
if (LocalDateUtils.greater(localDateTime, LocalDateTime.now())) {
throw new GlobalException("token 過期!");
}
// 驗證 token 簽名
Object loginName = claims.get(BusinessConsts.USER_NAME);
if (StringUtils.isNullAndSpaceOrEmpty(loginName)) {
loginName = claims.get(BusinessConsts.LOGIN_NAME);
}
StringBuilder builder = new StringBuilder();
builder.append(String.format("loginName=%s&effective=%s&time=%s&userAgent=%s", loginName, effective, time, userAgent));
token = String.valueOf(claims.get(BusinessConsts.HEADER_TOKEN));
String tokenPassword = Md5Utils.getMd5(builder.toString());
if (!tokenPassword.equals(token)) {
throw new GlobalException("token 簽名驗證失??!");
}
} catch (Exception ex) {
String message = "token 驗證失?。?;
if (ex instanceof GlobalException) {
message = ex.getMessage();
}
throw new GlobalException(message);
}
// 返回結(jié)果
return token;
}
7、測試
public static void main(String[] args) {
// 生成 JWT token
Map
map.put(BusinessConsts.LOGIN_NAME, "username");
long time = System.currentTimeMillis() / IntegerConsts.ONE_THOUSAND;
map.put(BusinessConsts.TIME, time);
map.put(BusinessConsts.USER_NAME, "username");
map.put(BusinessConsts.USER_TYPE, "userType");
map.put(BusinessConsts.DISPLAY_NAME, "displayName");
// 暫不需要該參數(shù)
String userAgent = StringUtils.Empty;
StringBuilder builder = new StringBuilder();
/**
* 加密 token 參數(shù)
*/
long EFFECTIVE = IntegerConsts.TWENTY_FOUR * IntegerConsts.SIXTY * IntegerConsts.SIXTY;
String TOKEN_ENCRYPTION = "loginName=%s&effective=%s&time=%s&userAgent=%s";
builder.append(String.format(TOKEN_ENCRYPTION,
"username", EFFECTIVE, time, userAgent));
String tokenValue = Md5Utils.getMd5(builder.toString());
map.put(BusinessConsts.HEADER_TOKEN, tokenValue);
//密鑰
String key = "cdkj-framework-jwt";
String token = JwtUtils.createJwt(map, key, System.currentTimeMillis() + 10000);
try {
JwtUtils.checkToken(token, key, "");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("JWT加密的結(jié)果:" + token);
System.out.println("JWT解密的結(jié)果:" + parseJwt(token, key));
}
測試結(jié)果
柚子快報激活碼778899分享:Java JWT加密、解密
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。