SM3,SM4參數加密


前幾天和其他公司系統做對接,每隔5分鍾把數據推到對方系統。

 sign生成規則:sm3(年月日+單位編碼+byzl@smart)

sid=sm4(
{
"depaCode":"4403",
"sign":"11111",
"registerDeskAmount":1,
"inoculateDeskAmount":1,
"watchingAmount":1,
"serviceAmount":1
})
secretKey密鑰
V3UvdKISG6BnBEqq
示例
http://192.168.199.62:9778/smart/api/getSmartScreenDigital

 

引入maven依賴

<!--使用SM工具類 -->

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.62</version>
</dependency>


封裝SM加密工具類
package com.jwx.digital.client.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import lombok.extern.slf4j.Slf4j;

/**
 * SMUtils:SM加密工具類
 * @Date 2020-10-29
 * @version 1.0
 */
@Slf4j
public class SMUtils {

    /**
     * 默認的 sm4加密key
     */
    public static final String DEFAULT_SM4_SECRET_KEY = "123456";

    /**
     * SM2加密例子
     * @param data 需要加密的字符串
     * @return 返回加密后的字符串
     */
    public static String toSM2Str(String data) {
        SM2 sm2 = SmUtil.sm2();
        // 公鑰加密,私鑰解密
        String encryptStr = sm2.encryptBcd(data, KeyType.PublicKey);
        String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
        return encryptStr;
    }

    /**
     * SM3加密
     * @param data 需要加密的字符串
     * @return 返回加密后的字符串
     */
    public static String toSM3Str(String data) {
        return SmUtil.sm3(data).toUpperCase();
    }

    /**
     * SM4加密
     * @param data 需要加密的字符串
     * @param secretKey 需要加密的字符串
     * @return 返回加密后的字符串
     */
    public static String toSM4Str(String data,String secretKey) {
        SymmetricCrypto sm4 = SmUtil.sm4(secretKey.getBytes(CharsetUtil.CHARSET_UTF_8));
        return sm4.encryptHex(data, CharsetUtil.CHARSET_UTF_8).toUpperCase();
    }

    public static String toSM4Str(String data) {
        return toSM4Str(data,DEFAULT_SM4_SECRET_KEY);
    }

    /**
     * SM4解密
     * @param data 需要加密的字符串
     * @param secretKey 需要加密的字符串
     * @return 返回加密后的字符串
     */
    public static String parseSM4Str(String data,String secretKey) {
        SymmetricCrypto sm4 = SmUtil.sm4(secretKey.getBytes(CharsetUtil.CHARSET_UTF_8));
        return sm4.decryptStr(data, CharsetUtil.CHARSET_UTF_8);
    }

    public static String parseSM4Str(String data) {
        return parseSM4Str(data,DEFAULT_SM4_SECRET_KEY);
    }


}

 

參數實體
package com.jwx.digital.client.pojo.dto.ybzl;

import com.jwx.commons.core.pojo.BaseDTO;
import lombok.Data;

/**
 * YbzlSmartScreenDigitalDTO
 *
 * @author 紅葉如醉
 * @version 1.0
 * @Date 2020-10-28
 */
@Data
public class YbzlSmartScreenDigitalDTO extends BaseDTO {

    /**
     * 單位編碼
     */
    private String depaCode;

    /**
     *校驗碼
     */
    private String sign;

    /**
     *當天(所有)登記台排隊人數
     */
    private Integer registerDeskAmount;

    /**
     *當天(所有)接種台排隊人數
     */
    private Integer inoculateDeskAmount;

    /**
     *當天(所有)留觀排隊人數
     */
    private Integer watchingAmount;

    /**
     *當天(所有)服務人數
     */
    private Integer serviceAmount;

}

參數加密,調用外部接口

 /**
     * 統計該門診人數情況
     *
     * @return
     */
    @Override
    public YbzlSmartScreenDigitalDTO CountSmartScreenDigital() {
        YbzlSmartScreenDigitalDTO ybzlSmartScreenDigitalDTO = new YbzlSmartScreenDigitalDTO();
        ybzlSmartScreenDigitalDTO.setDepaCode(depaCode);
        // sign生成規則:sm3(年月日+單位編碼+ybzl@cybermax)
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(format.format(new Date())).append(depaCode).append(serverUrlProperties.getSignSecret());
        ybzlSmartScreenDigitalDTO.setSign(SMUtils.toSM3Str(stringBuilder.toString()));

        Example example = new Example(TicketActionDO.class);
        example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.REGISTRATION.getValue())
                .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay());
        //登記總人數
        int registerDeskAmount = ticketActionMapper.selectCountByExample(example);
        ybzlSmartScreenDigitalDTO.setRegisterDeskAmount(registerDeskAmount);
        example.clear();

        example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.VACCINATION.getValue())
                .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay());
        //接種總人數
        ybzlSmartScreenDigitalDTO.setInoculateDeskAmount(ticketActionMapper.selectCountByExample(example));
        example.clear();

        example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.WATCH.getValue())
                .andEqualTo("tiacStatus", TicketActionStatusEnum.PROCESSING.getValue())
                .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay());
        //正在留觀人數,不包括完成
        ybzlSmartScreenDigitalDTO.setWatchingAmount(ticketActionMapper.selectCountByExample(example));
//當天服務人數 == 登記的人數
        ybzlSmartScreenDigitalDTO.setServiceAmount(registerDeskAmount);
        String sid = SMUtils.toSM4Str(JSON.toJSONString(ybzlSmartScreenDigitalDTO), serverUrlProperties.getSecretKey());
        Response<OuterResult> resultResponse;
        try {

            ybzlInterface = RetrofitFactory.getYbzlApi();
            log.info("推送登記接種留觀服務人數到服務{} 數據內容{} ====== start", serverUrlProperties.getYbzlUrl(),JSON.toJSONString(ybzlSmartScreenDigitalDTO));
            resultResponse = ybzlInterface.getSmartScreenDigital(sid).execute();
            if(resultResponse.body()==null){
                log.error("推送登記接種留觀服務人數到服務{} 返回消息體為空",serverUrlProperties.getYbzlUrl());
            }else if (BasicEcode.SUCCESS.equals(resultResponse.body().getEcode())) {
                log.info("推送登記接種留觀服務人數到服務{}成功",serverUrlProperties.getYbzlUrl());
            }else {
                log.error("推送登記接種留觀服務人數到服務{}異常 錯誤碼{}", serverUrlProperties.getYbzlUrl(),resultResponse.body().getEcode());
            }
        } catch (Exception e) {
            log.error("推送登記接種留觀服務人數到服務{}異常{}", serverUrlProperties.getYbzlUrl(),e);
        }
        log.info("推送登記接種留觀服務人數 ====== end");
        return ybzlSmartScreenDigitalDTO;
    }

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM