入库数据做签名

This commit is contained in:
cheney 2026-05-21 10:39:27 +08:00
parent 01245a6b10
commit da8fbae4eb
5 changed files with 49 additions and 21 deletions

View File

@ -1,25 +1,13 @@
package com.cisd.tms; package com.cisd.tms;
import com.cisd.tms.common.crypto.config.ConfigCryptoCli; import com.cisd.tms.common.crypto.config.ConfigCryptoCli;
import com.cisd.tms.modules.log.entity.OperationAuditLogEntity;
import com.cisd.tms.modules.log.enums.ActionType;
import com.cisd.tms.modules.log.enums.AuthLevel;
import com.cisd.tms.modules.log.enums.AuditStatus;
import com.cisd.tms.modules.log.enums.ModuleCode;
import com.cisd.tms.modules.log.enums.OperationResult;
import com.cisd.tms.modules.log.enums.OperatorRoleCode;
import com.cisd.tms.modules.log.repository.OperationAuditLogRepository;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import java.time.LocalDateTime;
import java.util.UUID;
@SpringBootApplication @SpringBootApplication
@ConfigurationPropertiesScan @ConfigurationPropertiesScan
@EnableScheduling @EnableScheduling

View File

@ -1,22 +1,28 @@
package com.cisd.tms.infrastructure.persistence.mybatis; package com.cisd.tms.infrastructure.persistence.mybatis;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import java.time.LocalDateTime;
import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService;
import com.cisd.tms.modules.datamac.helper.Sm2EntitySigner; import com.cisd.tms.modules.datamac.helper.Sm2EntitySigner;
import com.cisd.tms.modules.datamac.helper.Sm3MacCalculator;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component @Component
@Primary @Primary
@RequiredArgsConstructor
public class CommonMetaObjectHandler implements MetaObjectHandler { public class CommonMetaObjectHandler implements MetaObjectHandler {
@Lazy
@Autowired
private final JnaPcieCryptoService sdf; private final JnaPcieCryptoService sdf;
public CommonMetaObjectHandler(@Lazy JnaPcieCryptoService cryptoService) {
this.sdf = cryptoService;
}
// 密钥对的索引 // 密钥对的索引
private final int KEYPAIR_INDEX = 1; private final int KEYPAIR_INDEX = 1;
@ -33,7 +39,7 @@ public class CommonMetaObjectHandler implements MetaObjectHandler {
// 插入时直接基于当前实体对象计算签名 // 插入时直接基于当前实体对象计算签名
if (metaObject.hasSetter("signature")) { if (metaObject.hasSetter("signature")) {
Object entity = metaObject.getOriginalObject(); Object entity = metaObject.getOriginalObject();
String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); String signature = Sm2EntitySigner.signMayNull(sdf, KEYPAIR_INDEX, entity);
this.strictInsertFill(metaObject, "signature", String.class, signature); this.strictInsertFill(metaObject, "signature", String.class, signature);
} }
} }
@ -46,7 +52,7 @@ public class CommonMetaObjectHandler implements MetaObjectHandler {
// 插入时直接基于当前实体对象计算 MAC // 插入时直接基于当前实体对象计算 MAC
if (metaObject.hasSetter("mac")) { if (metaObject.hasSetter("mac")) {
Object entity = metaObject.getOriginalObject(); Object entity = metaObject.getOriginalObject();
String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); String signature = Sm2EntitySigner.signMayNull(sdf, KEYPAIR_INDEX, entity);
this.strictInsertFill(metaObject, "signature", String.class, signature); this.strictInsertFill(metaObject, "signature", String.class, signature);
} }
} }

View File

@ -15,6 +15,9 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier; import java.util.function.Supplier;
//import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -39,6 +42,7 @@ public class JnaPcieCryptoService implements PcieCryptoService {
private final boolean strictAlgIdValidation; private final boolean strictAlgIdValidation;
private final long recoverUserKeyAsyncDelayMillis; private final long recoverUserKeyAsyncDelayMillis;
public JnaPcieCryptoService(PcieSessionTemplate sessionTemplate, CryptoCardProperties properties) { public JnaPcieCryptoService(PcieSessionTemplate sessionTemplate, CryptoCardProperties properties) {
this(sessionTemplate, properties, RECOVER_USER_KEY_ASYNC_DELAY_MILLIS); this(sessionTemplate, properties, RECOVER_USER_KEY_ASYNC_DELAY_MILLIS);
} }

View File

@ -1,8 +1,12 @@
package com.cisd.tms.modules.datamac.helper; package com.cisd.tms.modules.datamac.helper;
import com.cisd.tms.TmsApplication;
import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult;
import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest;
import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService;
import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -12,8 +16,33 @@ import java.util.Comparator;
public class Sm2EntitySigner { public class Sm2EntitySigner {
private static final byte[] DEFAULT_SM2_USER_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8); private static final byte[] DEFAULT_SM2_USER_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8);
private static final Logger log = LoggerFactory.getLogger(Sm2EntitySigner.class);
public static String sign(JnaPcieCryptoService sdf, int keyIdx, Object entity){ /**
* 对对象计算签名
* @param sdf
* @param keyIdx
* @param entity
* @return
*/
public static String signMayNull(PcieCryptoService sdf, int keyIdx, Object entity){
try {
return sign(sdf, keyIdx, entity);
} catch (Exception e) {
log.error("入库数据签名失败", e);
}
return null;
}
/**
* 对对象计算签名
* @param sdf
* @param keyIdx
* @param entity
* @return
*/
public static String sign(PcieCryptoService sdf, int keyIdx, Object entity){
// 1. 获取所有字段并按字段名排序保证不同实体计算的顺序一致 // 1. 获取所有字段并按字段名排序保证不同实体计算的顺序一致
Field[] fields = entity.getClass().getDeclaredFields(); Field[] fields = entity.getClass().getDeclaredFields();
Arrays.sort(fields, Comparator.comparing(Field::getName)); Arrays.sort(fields, Comparator.comparing(Field::getName));

View File

@ -10,6 +10,7 @@ import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult;
import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest; import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest;
import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest;
import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService;
import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService;
import com.cisd.tms.modules.cert.entity.KeyEntity; import com.cisd.tms.modules.cert.entity.KeyEntity;
import com.cisd.tms.modules.cert.service.CertificateService; import com.cisd.tms.modules.cert.service.CertificateService;
import com.cisd.tms.modules.cert.service.EntityService; import com.cisd.tms.modules.cert.service.EntityService;
@ -31,7 +32,7 @@ public class OpenApiService implements IOpenApiService {
private static final Logger log = LoggerFactory.getLogger(OpenApiService.class); private static final Logger log = LoggerFactory.getLogger(OpenApiService.class);
private final PcieSessionTemplate sessionTemplate; private final PcieSessionTemplate sessionTemplate;
private final JnaPcieCryptoService sdf; private final PcieCryptoService sdf;
// 签名验签均从证书 dn 作为索引所以引入证书服务类 // 签名验签均从证书 dn 作为索引所以引入证书服务类
private final CertificateService certificateService; private final CertificateService certificateService;