Browse Source

密评

dev-V1.0.9
vincent 1 month ago
parent
commit
ced9ce3fec
  1. 28
      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. 55
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java

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

@ -21,76 +21,64 @@ public interface IPasswordPartyService {
/** /**
* HSM - 对称加密 * HSM - 对称加密
* *
* @param keyIndex 用户密钥号,填0时使用keyData作为密钥
* @param algType 对称算法类型(SM1或SM4)
* @param key 外部密钥(keyIndex为0时生效,Hex 16进制) * @param key 外部密钥(keyIndex为0时生效,Hex 16进制)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制) * @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制)
* @param inputData 加密原文(Hex 16进制) * @param inputData 加密原文(Hex 16进制)
* @return 对称加密结果 * @return 对称加密结果
*/ */
SymmetryEncryptVo symmetryEncrypt(Integer keyIndex, int algType, String key, String iv, String inputData); SymmetryEncryptVo symmetryEncrypt(String key, String iv, String inputData);
/** /**
* HSM - 对称解密 * HSM - 对称解密
* *
* @param keyIndex 用户密钥号,填0时使用keyData作为密钥
* @param algType 对称算法类型(SM1或SM4)
* @param key 外部密钥(keyIndex为0时生效,Hex 16进制) * @param key 外部密钥(keyIndex为0时生效,Hex 16进制)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制) * @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制)
* @param inputData 解密密文(Hex 16进制) * @param inputData 解密密文(Hex 16进制)
* @return 对称解密结果 * @return 对称解密结果
*/ */
SymmetryEncryptVo symmetryDecrypt(Integer keyIndex, int algType, String key, String iv, String inputData); SymmetryEncryptVo symmetryDecrypt(String key, String iv, String inputData);
/** /**
* HSM - SM2签名 * HSM - SM2签名
* *
* @param keyIndex 密钥索引
* @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型) * @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型)
* @return 签名值(Hex 16进制类型) * @return 签名值(Hex 16进制类型)
*/ */
String sm2SignData(Integer keyIndex, String plainData); String sm2SignData(String plainData);
/** /**
* HSM - SM2验签 * HSM - SM2验签
* *
* @param algType 算法类型
* @param publicKey 公钥(使用导出公钥接口获取,Hex 16进制类型) * @param publicKey 公钥(使用导出公钥接口获取,Hex 16进制类型)
* @param signValue 签名值(Hex 16进制类型) * @param signValue 签名值(Hex 16进制类型)
* @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型) * @param plainData 明文摘要(先使用杂凑接口计算摘要,Hex 16进制类型)
* @return true=验证通过, false=验证失败 * @return true=验证通过, false=验证失败
*/ */
boolean sm2Verify(Integer algType, String publicKey, String signValue, String plainData); boolean sm2Verify(String publicKey, String signValue, String plainData);
/** /**
* HSM - 非对称加密 * HSM - 非对称加密
* *
* @param algType 算法ID(请查阅算法字典)
* @param publcKey 公钥(Hex 16进制类型) * @param publcKey 公钥(Hex 16进制类型)
* @param data 明文(Hex 16进制类型) * @param data 明文(Hex 16进制类型)
* @return 加密密文(Hex 16进制类型) * @return 加密密文(Hex 16进制类型)
*/ */
String externalEncrypt(Integer algType, String publcKey, String data); String externalEncrypt(String publcKey, String data);
/** /**
* HSM - 非对称解密 * HSM - 非对称解密
* *
* @param keyIndex 密钥索引 * @param enc 密文(Hex 16进制类型)
* @param algId 算法ID(请查阅算法字典)
* @param enc 密文(Hex 16进制类型)
* @return 解密明文(Hex 16进制类型) * @return 解密明文(Hex 16进制类型)
*/ */
String internalDecrypt(Integer keyIndex, Integer algId, String enc); String internalDecrypt(String enc);
/** /**
* HSM - HMAC摘要 * HSM - HMAC摘要
* *
* @param keyIndex 密钥索引(必填)
* @param key 密钥,非必传(Hex 16进制类型) * @param key 密钥,非必传(Hex 16进制类型)
* @param algType 算法ID标签,请使用SM3(查阅算法字典)
* @param inputData 明文摘要(Hex 16进制类型,必填) * @param inputData 明文摘要(Hex 16进制类型,必填)
* @return HMAC值(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 密码服务平台地址,按实际环境修改 */ /** HSM 密码服务平台地址,按实际环境修改 */
private static final String BASE_URL = "http://localhost:8080"; 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; private static IPasswordPartyService service;
/** /**
@ -90,12 +78,12 @@ public class PasswordPartyDemo {
System.out.println("----- 2. 对称加密 + 对称解密 -----"); System.out.println("----- 2. 对称加密 + 对称解密 -----");
String plainHex = "31323334353637383132333435363738"; 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("对称加密原文: " + plainHex);
System.out.println("对称加密密文: " + encryptResult.getOutData()); System.out.println("对称加密密文: " + encryptResult.getOutData());
assertNotBlank("encryptOutData", 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()); System.out.println("对称解密结果: " + decryptResult.getOutData());
assertNotBlank("decryptOutData", decryptResult.getOutData()); assertNotBlank("decryptOutData", decryptResult.getOutData());
@ -114,7 +102,7 @@ public class PasswordPartyDemo {
System.out.println("----- 3. SM2签名 + SM2验签 -----"); System.out.println("----- 3. SM2签名 + SM2验签 -----");
String plainDataHex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; String plainDataHex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
String signValue = service.sm2SignData(KEY_INDEX, plainDataHex); String signValue = service.sm2SignData(plainDataHex);
System.out.println("SM2签名原文(摘要): " + plainDataHex); System.out.println("SM2签名原文(摘要): " + plainDataHex);
System.out.println("SM2签名值: " + signValue); System.out.println("SM2签名值: " + signValue);
assertNotBlank("signData", signValue); assertNotBlank("signData", signValue);
@ -131,12 +119,12 @@ public class PasswordPartyDemo {
String plainHex = "31323334"; String plainHex = "31323334";
String publicKey = getTestPublicKey(); String publicKey = getTestPublicKey();
String encryptData = service.externalEncrypt(ALG_SM2, publicKey, plainHex); String encryptData = service.externalEncrypt(publicKey, plainHex);
System.out.println("非对称加密原文: " + plainHex); System.out.println("非对称加密原文: " + plainHex);
System.out.println("非对称加密密文: " + encryptData); System.out.println("非对称加密密文: " + encryptData);
assertNotBlank("encryptData", encryptData); assertNotBlank("encryptData", encryptData);
String decrypted = service.internalDecrypt(KEY_INDEX, ALG_SM2, encryptData); String decrypted = service.internalDecrypt(encryptData);
System.out.println("非对称解密结果: " + decrypted); System.out.println("非对称解密结果: " + decrypted);
assertNotBlank("decrypted", decrypted); assertNotBlank("decrypted", decrypted);
@ -155,7 +143,7 @@ public class PasswordPartyDemo {
System.out.println("----- 5. HMAC摘要 -----"); System.out.println("----- 5. HMAC摘要 -----");
String inputDataHex = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; 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输入摘要: " + inputDataHex);
System.out.println("HMAC输出值: " + hmac); System.out.println("HMAC输出值: " + hmac);
assertNotBlank("hmac", hmac); assertNotBlank("hmac", hmac);

55
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 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 key 外部密钥,keyIndex为0时生效(Hex 16进制类型)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型) * @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型)
* @param inputData 加密原文(Hex 16进制类型) * @param inputData 加密原文(Hex 16进制类型)
* @return 对称加密结果 * @return 对称加密结果
*/ */
@Override @Override
public SymmetryEncryptVo symmetryEncrypt(Integer keyIndex, int algType, String key, String iv, String inputData) { public SymmetryEncryptVo symmetryEncrypt(String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(keyIndex, algType, key, iv, inputData); JSONObject params = buildSymmetryParams(key, iv, inputData);
JSONObject data = callHsmApi("/hsm/api/symmetryEncrypt", params, "对称加密"); JSONObject data = callHsmApi("/hsm/api/symmetryEncrypt", params, "对称加密");
return buildSymmetryEncryptVo(data); 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 key 外部密钥,keyIndex为0时生效(Hex 16进制类型)
* @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型) * @param iv IV值,CBC/CFB/OFB模式时必传(Hex 16进制类型)
* @param inputData 解密原文(Hex 16进制类型) * @param inputData 解密原文(Hex 16进制类型)
* @return 对称解密结果 * @return 对称解密结果
*/ */
@Override @Override
public SymmetryEncryptVo symmetryDecrypt(Integer keyIndex, int algType, String key, String iv, String inputData) { public SymmetryEncryptVo symmetryDecrypt(String key, String iv, String inputData) {
JSONObject params = buildSymmetryParams(keyIndex, algType, key, iv, inputData); JSONObject params = buildSymmetryParams(key, iv, inputData);
JSONObject data = callHsmApi("/hsm/api/symmetryDecrypt", params, "对称解密"); JSONObject data = callHsmApi("/hsm/api/symmetryDecrypt", params, "对称解密");
return buildSymmetryEncryptVo(data); return buildSymmetryEncryptVo(data);
@ -78,14 +77,13 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/** /**
* SM2签名 * SM2签名
* *
* @param keyIndex 密钥索引
* @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型) * @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型)
* @return 签名值(Hex 16进制类型) * @return 签名值(Hex 16进制类型)
*/ */
@Override @Override
public String sm2SignData(Integer keyIndex, String plainData) { public String sm2SignData(String plainData) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex); params.put("keyIndex", KEY_INDEX);
params.put("plainData", plainData); params.put("plainData", plainData);
JSONObject data = callHsmApi("/hsm/api/SM2SignData", params, "SM2签名"); JSONObject data = callHsmApi("/hsm/api/SM2SignData", params, "SM2签名");
@ -95,16 +93,15 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/** /**
* SM2验签 * SM2验签
* *
* @param algType 算法类型
* @param publicKey 公钥,使用导出公钥接口获取(Hex 16进制类型) * @param publicKey 公钥,使用导出公钥接口获取(Hex 16进制类型)
* @param signValue 签名值(Hex 16进制类型) * @param signValue 签名值(Hex 16进制类型)
* @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型) * @param plainData 明文摘要,先使用杂凑接口计算摘要(Hex 16进制类型)
* @return true=验证通过 * @return true=验证通过
*/ */
@Override @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(); JSONObject params = new JSONObject();
params.put("algType", algType); params.put("algType", ALG_TYPE);
params.put("publicKey", publicKey); params.put("publicKey", publicKey);
params.put("signValue", signValue); params.put("signValue", signValue);
params.put("plainData", plainData); params.put("plainData", plainData);
@ -116,15 +113,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/** /**
* 非对称加密 * 非对称加密
* *
* @param algType 算法ID
* @param publcKey 公钥(Hex 16进制类型) * @param publcKey 公钥(Hex 16进制类型)
* @param data 明文(Hex 16进制类型) * @param data 明文(Hex 16进制类型)
* @return 加密密文(Hex 16进制类型) * @return 加密密文(Hex 16进制类型)
*/ */
@Override @Override
public String externalEncrypt(Integer algType, String publcKey, String data) { public String externalEncrypt(String publcKey, String data) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("algType", algType); params.put("algType", ALG_TYPE);
params.put("publcKey", publcKey); params.put("publcKey", publcKey);
params.put("data", data); params.put("data", data);
@ -135,16 +131,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/** /**
* 非对称解密 * 非对称解密
* *
* @param keyIndex 密钥索引 * @param enc 密文(Hex 16进制类型)
* @param algId 算法ID
* @param enc 密文(Hex 16进制类型)
* @return 解密明文(Hex 16进制类型) * @return 解密明文(Hex 16进制类型)
*/ */
@Override @Override
public String internalDecrypt(Integer keyIndex, Integer algId, String enc) { public String internalDecrypt(String enc) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex); params.put("keyIndex", KEY_INDEX);
params.put("algId", algId); params.put("algId", ALG_TYPE);
params.put("enc", enc); params.put("enc", enc);
JSONObject data = callHsmApi("/hsm/api/internalDecrypt", params, "非对称解密"); JSONObject data = callHsmApi("/hsm/api/internalDecrypt", params, "非对称解密");
@ -154,20 +148,18 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
/** /**
* HMAC摘要 * HMAC摘要
* *
* @param keyIndex 密钥索引(必填)
* @param key 密钥,非必传(Hex 16进制类型) * @param key 密钥,非必传(Hex 16进制类型)
* @param algType 算法ID标签,请使用SM3
* @param inputData 明文摘要(Hex 16进制类型,必填) * @param inputData 明文摘要(Hex 16进制类型,必填)
* @return HMAC值(Hex 16进制类型) * @return HMAC值(Hex 16进制类型)
*/ */
@Override @Override
public String hmacWithIndex(Integer keyIndex, String key, Integer algType, String inputData) { public String hmacWithIndex(String key, String inputData) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex); params.put("keyIndex", KEY_INDEX);
if (key != null) { if (key != null) {
params.put("key", key); params.put("key", key);
} }
params.put("algType", algType); params.put("algType", "SM3");
params.put("inputData", inputData); params.put("inputData", inputData);
JSONObject data = callHsmApi("/hsm/api/HmacWithIndex", params, "HMAC"); 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(); JSONObject params = new JSONObject();
params.put("keyIndex", keyIndex); params.put("keyIndex", KEY_INDEX);
params.put("algType", algType); params.put("algType", ALG_TYPE);
if (key != null) { if (key != null) {
params.put("key", key); params.put("key", key);
} }
@ -260,5 +252,4 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService {
throw new BaseException("HSM" + apiName + "异常: " + e.getMessage()); throw new BaseException("HSM" + apiName + "异常: " + e.getMessage());
} }
} }
} }

Loading…
Cancel
Save