package com.example.demo.util;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.crypto.MACVerifier;
import com.nimbusds.jose.crypto.RSASSAVerifier;
import net.minidev.json.JSONObject;
import org.apache.commons.codec.binary.Base64;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
/**
* Created by lisi
*/
public class JwtSignUtils {
/**
* 指定加密算法为RSA
*/
private static String ALGORITHM = "Rsa";
public static JSONObject validateTokenHs256(String token,String secret){
return validateToken(token,secret,null);
}
public static JSONObject validateTokenRs256(String token,String publicKey){
return validateToken(token,null,publicKey);
}
public static JSONObject validateToken(String token,String secret,String publicKey){
try{
JWSObject jwsObject = JWSObject.parse(token);
JWSHeader jwsHeader = jwsObject.getHeader();
String alg = jwsHeader.getAlgorithm().getName();
JWSVerifier verifier = null;
if("HS256".equals(alg)){
verifier = new MACVerifier(secret);
}else{
RSAPublicKey rsaPublicKey = loadPublicKey(publicKey);
verifier = new RSASSAVerifier(rsaPublicKey);
}
boolean validFlag = jwsObject.verify(verifier);
if(validFlag){
Payload payload = jwsObject.getPayload();
JSONObject payloadJo = (JSONObject) payload.toJSONObject();
return payloadJo;
}else{
return null;
}
}catch (Exception e){
return null;
}
}
/**
* 从文件中输入流中加载公钥
*/
public static RSAPublicKey loadPublicKey(InputStream in) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String readLine = null;
StringBuilder sb = new StringBuilder();
while ((readLine = br.readLine()) != null) {
if (readLine.charAt(0) == '-') {
continue;
} else {
sb.append(readLine);
sb.append('\r');
}
}
return loadPublicKey(sb.toString());
}
/**
* 从字符串中加载公钥
*/
public static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception {
byte[] buffer = Base64.decodeBase64(publicKeyStr);
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
}
public static String clearKeyInvalidInfo(String key) {
if (key.contains("-----BEGIN PUBLIC KEY-----")) {
key = key.replace("-----BEGIN PUBLIC KEY-----", "");
}
if (key.contains("-----END PUBLIC KEY-----")) {
key = key.replaceAll("-----END PUBLIC KEY-----", "");
}
if (key.contains("-----BEGIN PRIVATE KEY-----")) {
key = key.replaceAll("-----BEGIN PRIVATE KEY-----", "");
}
if (key.contains("-----END PRIVATE KEY-----")) {
key = key.replaceAll("-----END PRIVATE KEY-----", "");
}
if (key.contains("\\n")) {
key = key.replaceAll("\\n", "");
}
if (key.contains(" ")) {
key = key.replaceAll(" ", "");
}
return key;
}
}
Oauth2.0 + JWT、JSON解析、调用三方URL.zip
需积分: 1 151 浏览量
2023-12-18
11:54:22
上传
评论
收藏 121KB ZIP 举报
zhrmghgwsrmws
- 粉丝: 235
- 资源: 59
最新资源
- HITK0203MP-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HITK0202MP-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说
- 电子电气工程师使用的单位和符号
- HITK0201MP-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- MyBatis动态SQL:构建灵活查询的利器.md
- HITJ0303MP-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- tesseract安装包
- 1_32陀螺仪舵机.zip
- HITJ0302MP-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- XILINXFPGA源码PCIExpress标准概述
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈