Browse Source

密评

dev-V1.0.9
vincent 1 month ago
parent
commit
ced9ce3fec
  1. 26
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/IPasswordPartyService.java
  2. 24
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/PasswordPartyDemo.java
  3. 53
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java

26
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/IPasswordPartyService.java

@ -21,76 +21,64 @@ public interface IPasswordPartyService {
/**
* HSM - 对称加密
*
* @param keyIndex 用户密钥号,填0时使用keyData作为密钥
* @param algType 对称算法类型(SM1或SM4)
* @param key 外部密钥(keyIndex为0时生效,Hex 16进制)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制)
* @param inputData 加密原文(Hex 16进制)
* @return 对称加密结果
*/
SymmetryEncryptVo symmetryEncrypt(Integer keyIndex, int algType, String key, String iv, String inputData);
SymmetryEncryptVo symmetryEncrypt(String key, String iv, String inputData);
/**
* HSM - 对称解密
*
* @param keyIndex 用户密钥号,填0时使用keyData作为密钥
* @param algType 对称算法类型(SM1或SM4)
* @param key 外部密钥(keyIndex为0时生效,Hex 16进制)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制)
* @param inputData 解密密文(Hex 16进制)
* @return 对称解密结果
*/
SymmetryEncryptVo symmetryDecrypt(Integer keyIndex, int algType, String key, String iv, String inputData);
SymmetryEncryptVo symmetryDecrypt(String key, String iv, String inputData);
/**
* HSM - SM2签名
*
* @param keyIndex 密钥索引
* @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型)
* @return 签名值(Hex 16进制类型)
*/
String sm2SignData(Integer keyIndex, String plainData);
String sm2SignData(String plainData);
/**
* HSM - SM2验签
*
* @param algType 算法类型
* @param publicKey 公钥(使用导出公钥接口获取,Hex 16进制类型)
* @param signValue 签名值(Hex 16进制类型)
* @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型)
* @return true=验证通过, false=验证失败
*/
boolean sm2Verify(Integer algType, String publicKey, String signValue, String plainData);
boolean sm2Verify(String publicKey, String signValue, String plainData);
/**
* HSM - 非对称加密
*
* @param algType 算法ID(请查阅算法字典)
* @param publcKey 公钥(Hex 16进制类型)
* @param data 明文(Hex 16进制类型)
* @return 加密密文(Hex 16进制类型)
*/
String externalEncrypt(Integer algType, String publcKey, String data);
String externalEncrypt(String publcKey, String data);
/**
* HSM - 非对称解密
*
* @param keyIndex 密钥索引
* @param algId 算法ID(请查阅算法字典)
* @param enc 密文(Hex 16进制类型)
* @return 解密明文(Hex 16进制类型)
*/
String internalDecrypt(Integer keyIndex, Integer algId, String enc);
String internalDecrypt(String enc);
/**
* HSM - HMAC摘要
*
* @param keyIndex 密钥索引(必填)
* @param key 密钥,非必传(Hex 16进制类型)
* @param algType 算法ID标签,请使用SM3(查阅算法字典)
* @param inputData 明文摘要(Hex 16进制类型,必填)
* @return HMAC值(Hex 16进制类型)
*/
String hmacWithIndex(Integer keyIndex, String key, Integer algType, String inputData);
String hmacWithIndex(String key, String inputData);
}

24
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/PasswordPartyDemo.java

@ -21,18 +21,6 @@ public class PasswordPartyDemo {
/** HSM 密码服务平台地址,按实际环境修改 */
private static final String BASE_URL = "http://localhost:8080";
/** 测试用密钥索引 */
private static final int KEY_INDEX = 1;
/** SM4 算法ID(按实际算法字典修改) */
private static final int ALG_SM4 = 1;
/** SM2 算法ID */
private static final int ALG_SM2 = 2;
/** SM3 算法ID */
private static final int ALG_SM3 = 4;
private static IPasswordPartyService service;
/**
@ -90,12 +78,12 @@ public class PasswordPartyDemo {
System.out.println("----- 2. 对称加密 + 对称解密 -----");
String plainHex = "31323334353637383132333435363738";
SymmetryEncryptVo encryptResult = service.symmetryEncrypt(KEY_INDEX, ALG_SM4, null, null, plainHex);
SymmetryEncryptVo encryptResult = service.symmetryEncrypt(null, null, plainHex);
System.out.println("对称加密原文: " + plainHex);
System.out.println("对称加密密文: " + encryptResult.getOutData());
assertNotBlank("encryptOutData", encryptResult.getOutData());
SymmetryEncryptVo decryptResult = service.symmetryDecrypt(KEY_INDEX, ALG_SM4, null, null, encryptResult.getOutData());
SymmetryEncryptVo decryptResult = service.symmetryDecrypt(null, null, encryptResult.getOutData());
System.out.println("对称解密结果: " + decryptResult.getOutData());
assertNotBlank("decryptOutData", decryptResult.getOutData());
@ -114,7 +102,7 @@ public class PasswordPartyDemo {
System.out.println("----- 3. SM2签名 + SM2验签 -----");
String plainDataHex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
String signValue = service.sm2SignData(KEY_INDEX, plainDataHex);
String signValue = service.sm2SignData(plainDataHex);
System.out.println("SM2签名原文(摘要): " + plainDataHex);
System.out.println("SM2签名值: " + signValue);
assertNotBlank("signData", signValue);
@ -131,12 +119,12 @@ public class PasswordPartyDemo {
String plainHex = "31323334";
String publicKey = getTestPublicKey();
String encryptData = service.externalEncrypt(ALG_SM2, publicKey, plainHex);
String encryptData = service.externalEncrypt(publicKey, plainHex);
System.out.println("非对称加密原文: " + plainHex);
System.out.println("非对称加密密文: " + encryptData);
assertNotBlank("encryptData", encryptData);
String decrypted = service.internalDecrypt(KEY_INDEX, ALG_SM2, encryptData);
String decrypted = service.internalDecrypt(encryptData);
System.out.println("非对称解密结果: " + decrypted);
assertNotBlank("decrypted", decrypted);
@ -155,7 +143,7 @@ public class PasswordPartyDemo {
System.out.println("----- 5. HMAC摘要 -----");
String inputDataHex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
String hmac = service.hmacWithIndex(KEY_INDEX, null, ALG_SM3, inputDataHex);
String hmac = service.hmacWithIndex(null, inputDataHex);
System.out.println("HMAC输入摘要: " + inputDataHex);
System.out.println("HMAC输出值: " + hmac);
assertNotBlank("hmac", hmac);

53
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java

@ -24,6 +24,9 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
private final PasswordPartyConfig passwordPartyConfig;
private static final int KEY_INDEX = 5;
private static final String ALG_TYPE = "SM4";
/**
* 生成随机数
*
@ -42,16 +45,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* 对称加密
*
* @param keyIndex 用户密钥号,填0时使用keyData做密钥
* @param algType 对称算法SM1或SM4
* @param key 外部密钥,keyIndex为0时生效(Hex 16进制类型)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型)
* @param inputData 加密原文(Hex 16进制类型)
* @return 对称加密结果
*/
@Override
public SymmetryEncryptVo symmetryEncrypt(Integer keyIndex, int algType, String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(keyIndex, algType, key, iv, inputData);
public SymmetryEncryptVo symmetryEncrypt(String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(key, iv, inputData);
JSONObject data = callHsmApi("/hsm/api/symmetryEncrypt", params, "对称加密");
return buildSymmetryEncryptVo(data);
@ -60,16 +61,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* 对称解密
*
* @param keyIndex 用户密钥号,填0时使用keyData做密钥
* @param algType 对称算法SM1或SM4
* @param key 外部密钥,keyIndex为0时生效(Hex 16进制类型)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型)
* @param inputData 解密原文(Hex 16进制类型)
* @return 对称解密结果
*/
@Override
public SymmetryEncryptVo symmetryDecrypt(Integer keyIndex, int algType, String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(keyIndex, algType, key, iv, inputData);
public SymmetryEncryptVo symmetryDecrypt(String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(key, iv, inputData);
JSONObject data = callHsmApi("/hsm/api/symmetryDecrypt", params, "对称解密");
return buildSymmetryEncryptVo(data);
@ -78,14 +77,13 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* SM2签名
*
* @param keyIndex 密钥索引
* @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型)
* @return 签名值(Hex 16进制类型)
*/
@Override
public String sm2SignData(Integer keyIndex, String plainData) {
public String sm2SignData(String plainData) {
JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex);
params.put("keyIndex", KEY_INDEX);
params.put("plainData", plainData);
JSONObject data = callHsmApi("/hsm/api/SM2SignData", params, "SM2签名");
@ -95,16 +93,15 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* SM2验签
*
* @param algType 算法类型
* @param publicKey 公钥,使用导出公钥接口获取(Hex 16进制类型)
* @param signValue 签名值(Hex 16进制类型)
* @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型)
* @return true=验证通过
*/
@Override
public boolean sm2Verify(Integer algType, String publicKey, String signValue, String plainData) {
public boolean sm2Verify(String publicKey, String signValue, String plainData) {
JSONObject params = new JSONObject();
params.put("algType", algType);
params.put("algType", ALG_TYPE);
params.put("publicKey", publicKey);
params.put("signValue", signValue);
params.put("plainData", plainData);
@ -116,15 +113,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* 非对称加密
*
* @param algType 算法ID
* @param publcKey 公钥(Hex 16进制类型)
* @param data 明文(Hex 16进制类型)
* @return 加密密文(Hex 16进制类型)
*/
@Override
public String externalEncrypt(Integer algType, String publcKey, String data) {
public String externalEncrypt(String publcKey, String data) {
JSONObject params = new JSONObject();
params.put("algType", algType);
params.put("algType", ALG_TYPE);
params.put("publcKey", publcKey);
params.put("data", data);
@ -135,16 +131,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* 非对称解密
*
* @param keyIndex 密钥索引
* @param algId 算法ID
* @param enc 密文(Hex 16进制类型)
* @return 解密明文(Hex 16进制类型)
*/
@Override
public String internalDecrypt(Integer keyIndex, Integer algId, String enc) {
public String internalDecrypt(String enc) {
JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex);
params.put("algId", algId);
params.put("keyIndex", KEY_INDEX);
params.put("algId", ALG_TYPE);
params.put("enc", enc);
JSONObject data = callHsmApi("/hsm/api/internalDecrypt", params, "非对称解密");
@ -154,20 +148,18 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* HMAC摘要
*
* @param keyIndex 密钥索引(必填)
* @param key 密钥,非必传(Hex 16进制类型)
* @param algType 算法ID标签,请使用SM3
* @param inputData 明文摘要(Hex 16进制类型,必填)
* @return HMAC值(Hex 16进制类型)
*/
@Override
public String hmacWithIndex(Integer keyIndex, String key, Integer algType, String inputData) {
public String hmacWithIndex(String key, String inputData) {
JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex);
params.put("keyIndex", KEY_INDEX);
if (key != null) {
params.put("key", key);
}
params.put("algType", algType);
params.put("algType", "SM3");
params.put("inputData", inputData);
JSONObject data = callHsmApi("/hsm/api/HmacWithIndex", params, "HMAC");
@ -177,10 +169,10 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/**
* 构建对称加密/解密的公共请求参数
*/
private JSONObject buildSymmetryParams(Integer keyIndex, int algType, String key, String iv, String inputData) {
private JSONObject buildSymmetryParams(String key, String iv, String inputData) {
JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex);
params.put("algType", algType);
params.put("keyIndex", KEY_INDEX);
params.put("algType", ALG_TYPE);
if (key != null) {
params.put("key", key);
}
@ -260,5 +252,4 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
throw new BaseException("HSM" + apiName + "异常: " + e.getMessage());
}
}
}

Loading…
Cancel
Save