package cn.gistack.pwd.util;
|
|
import cn.gistack.pwd.dto.CBCResultDTO;
|
import cn.gistack.pwd.dto.ResultDTO;
|
import com.alibaba.fastjson.JSONObject;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.http.HttpEntity;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.MediaType;
|
import org.springframework.web.client.RestTemplate;
|
|
import java.security.SecureRandom;
|
import java.util.Base64;
|
|
/**
|
* @PROJECT_NAME: skjcmanager
|
* @DESCRIPTION: 云密码服务平台接口对接工具类
|
* @USER: aix
|
* @DATE: 2023/8/11 16:12
|
*/
|
@Configuration
|
public class PwdSendRequestUtil {
|
|
private static Logger logger = LoggerFactory.getLogger(PwdSendRequestUtil.class);
|
|
@Value("${yunPwd.config.url-prefix}")
|
public String urlPrefix;
|
|
/**
|
* 获取用户授权Token
|
*
|
* @return token
|
*/
|
public String getToken() {
|
String url = urlPrefix + "/api/Http/token";
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "GetToken");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("UserName", "c");
|
targetJson.put("AppID", "1655430695646eaab36117987e19026b");
|
targetJson.put("AppKey", "1445a67edb89302f6b9f055112b42c13");
|
|
jsonParm.put("Target", targetJson);
|
return apiRequest(url, jsonParm.toJSONString()).getData();
|
}
|
|
/**
|
* 密钥申请
|
*
|
* @return 密钥
|
*/
|
public String getKeyIndex() {
|
String url = urlPrefix + "/api/Http/scm";
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "ApplyKey");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("Token", getToken());
|
targetJson.put("Algorithm", "1445a67edb89302f6b9f055112b42c13");
|
|
jsonParm.put("Target", targetJson);
|
return apiRequest(url, jsonParm.toJSONString()).getData();
|
}
|
|
/**
|
* CBC加密
|
*
|
* @param message keyIndex:密钥 sm4IV:base64后的16字节字符串 maced:MAC计算值
|
* @return
|
*/
|
public CBCResultDTO getCBCMacEncipher(String message) {
|
|
String url = urlPrefix + "/api/Http/scm";
|
|
String sm4Iv = getSm4Iv();
|
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "CBCMac");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("Token", getToken());
|
targetJson.put("KeyIndex", getKeyIndex());
|
targetJson.put("Message", message);
|
targetJson.put("Sm4IV", sm4Iv);
|
|
jsonParm.put("Target", targetJson);
|
|
ResultDTO ret = apiRequest(url, jsonParm.toJSONString());
|
|
return new CBCResultDTO(getKeyIndex(), sm4Iv, ret.getData());
|
}
|
|
/**
|
* CBC加密 用户验证方法
|
*
|
* @param message keyIndex:密钥 sm4IV:base64后的16字节字符串 maced:MAC计算值
|
* @return
|
*/
|
public CBCResultDTO getCBCMacEncipher(String sm4Iv, String keyIndex, String message) {
|
|
String url = urlPrefix + "/api/Http/scm";
|
|
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "CBCMac");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("Token", getToken());
|
targetJson.put("KeyIndex", keyIndex);
|
targetJson.put("Message", message);
|
targetJson.put("Sm4IV", sm4Iv);
|
|
jsonParm.put("Target", targetJson);
|
|
ResultDTO ret = apiRequest(url, jsonParm.toJSONString());
|
|
return new CBCResultDTO(getKeyIndex(), sm4Iv, ret.getData());
|
}
|
|
/**
|
* 加密
|
* @param sm4Iv 算法为SM4时需要填写,16字节字符串
|
* @param keyIndex 密钥
|
* @param message 加密原数据
|
* @return 密文
|
*/
|
public ResultDTO getEncrypt(String sm4Iv, String keyIndex, String message) {
|
|
String url = urlPrefix + "/api/Http/scm";
|
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "Encrypt");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("Token", getToken());
|
targetJson.put("Algorithm", "SM4");
|
targetJson.put("Sm4Mode", "CBC");
|
targetJson.put("Sm4IV", sm4Iv);
|
targetJson.put("KeyIndex", keyIndex);
|
targetJson.put("Message", message);
|
|
jsonParm.put("Target", targetJson);
|
|
return apiRequest(url, jsonParm.toJSONString());
|
}
|
|
/**
|
* 解密
|
*
|
* @param sm4Iv 算法为SM4时需要填写,16字节字符串
|
* @param keyIndex 密钥
|
* @param message 待解密信息
|
* @return base64后的解密信息
|
*/
|
public ResultDTO getDecrypt(String sm4Iv, String keyIndex, String message) {
|
String url = urlPrefix + "/api/Http/scm";
|
|
JSONObject jsonParm = new JSONObject();
|
jsonParm.put("Action", "Decrypt");
|
jsonParm.put("DeviceType", "SCM");
|
|
JSONObject targetJson = new JSONObject();
|
targetJson.put("TimeStamp", String.valueOf(System.currentTimeMillis()));
|
targetJson.put("Token", getToken());
|
targetJson.put("Algorithm", "SM4");
|
targetJson.put("Sm4Mode", "CBC");
|
targetJson.put("Sm4IV", sm4Iv);
|
targetJson.put("KeyIndex", keyIndex);
|
targetJson.put("MessageCode", "base64");
|
targetJson.put("Message", message);
|
|
jsonParm.put("Target", targetJson);
|
|
return apiRequest(url, jsonParm.toJSONString());
|
}
|
|
/**
|
* 随机产生长度为16的字节数组并Base64编码
|
*
|
* @return Sm4IV
|
*/
|
public String getSm4Iv() {
|
|
// Generate random byte array
|
SecureRandom secureRandom = new SecureRandom();
|
byte[] byteArray = new byte[16];
|
secureRandom.nextBytes(byteArray);
|
// Encode byte array using Base64
|
String sm4IV = Base64.getEncoder().encodeToString(byteArray);
|
|
return sm4IV;
|
}
|
|
public ResultDTO apiRequest(String url, String params) {
|
logger.info("请求参数:" + params);
|
// 声明一个header变量
|
HttpHeaders headers = new HttpHeaders();
|
// 设置为json格式
|
MediaType mediaType = MediaType.parseMediaType("application/json;charset=utf-8");
|
headers.setContentType(mediaType);
|
|
HttpEntity<String> httpEntity = new HttpEntity(params, headers);
|
|
RestTemplate template = new RestTemplate();
|
ResultDTO resultDTO = template.postForObject(url, httpEntity, ResultDTO.class);
|
logger.info("返回结果:" + JSONObject.toJSONString(resultDTO));
|
return resultDTO;
|
}
|
|
}
|