教育训练处考试制证系统后端
heheng
2025-01-23 7c080352b0f763b422f939c4a320f8f9a6a26442
sign签名
已修改1个文件
已添加3个文件
152 ■■■■■ 文件已修改
exam-system/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/pom.xml
@@ -38,6 +38,12 @@
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version> <!-- 请检查最新版本 -->
        </dependency>
    </dependencies>
</project>
exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java
对比新文件
@@ -0,0 +1,34 @@
package com.gkhy.exam.pay.utils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Sign {
    private SignCommond signCommond;
    public Sign() {
        this.signCommond = new SignCommond();
    }
    public Element getSignature(String plain) {
        SignDto signDto = this.signCommond.signSm3Detach(plain);
        Document document = DocumentHelper.createDocument();
        Element signature = document.addElement("Signature");
        signature.addElement("id", "InvoicingParty");
        Element signedInfo = signature.addElement("SignedInfo");
        signedInfo.addElement("Reference").addAttribute("URI", "/EInvoice/Headerl/EInvoice/EInvoiceData");
        signedInfo.addElement("SignatureAlgorithm").setText(signDto.getSignatureAlgorithm());
        signedInfo.addElement("SignatureFormat").setText(signDto.getSignatureFormat());
        signature.addElement("SignatureTime").setText(signDto.getSignatureTime());
        signature.addElement("SignatureValue").setText(signDto.getSignatureValue());
        Element keyInfo = signature.addElement("KeyInfo");
        keyInfo.addElement("SerialNumber").setText(signDto.getSerialNumber());
        keyInfo.addElement("X509IssuerName").setText(signDto.getIssuerDn());
        return signature;
    }
}
exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java
对比新文件
@@ -0,0 +1,30 @@
package com.gkhy.exam.pay.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Date;
public class SignCommond {
    public SignDto signSm3Detach(String plain) {
        try {
            // 使用 SM3 算法生成摘要
            MessageDigest md = MessageDigest.getInstance("SM3");
            byte[] hashBytes = md.digest(plain.getBytes());
            // 将摘要转换为 Base64 编码的字符串
            String signatureValue = Base64.getEncoder().encodeToString(hashBytes);
            SignDto signDto = new SignDto("SM3", "Base64", new Date(), signatureValue, "1234567890", "issuerDn");
            return signDto;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}
exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
对比新文件
@@ -0,0 +1,82 @@
package com.gkhy.exam.pay.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class SignDto {
    private String signatureAlgorithm;
    private String signatureFormat;
    private String signatureTime;
    private String signatureValue;
    private String serialNumber;
    private String issuerDn;
    private static final String UTC_DATE_TIME = "dd MM yyyy HH:mm:ss z";
    public static String formatWithTime(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(UTC_DATE_TIME, Locale.CHINA);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        return sdf.format(date);
    }
    public SignDto(String signatureAlgorithm, String signatureFormat, Date signatureTime, String signatureValue, String serialNumber, String issuerDn) {
        this.signatureAlgorithm = signatureAlgorithm;
        this.signatureFormat = signatureFormat;
        this.signatureTime = formatWithTime(signatureTime);
        this.signatureValue = signatureValue;
        this.serialNumber = serialNumber;
        this.issuerDn = issuerDn;
    }
    // Getters and Setters
    public String getSignatureAlgorithm() {
        return signatureAlgorithm;
    }
    public void setSignatureAlgorithm(String signatureAlgorithm) {
        this.signatureAlgorithm = signatureAlgorithm;
    }
    public String getSignatureFormat() {
        return signatureFormat;
    }
    public void setSignatureFormat(String signatureFormat) {
        this.signatureFormat = signatureFormat;
    }
    public String getSignatureTime() {
        return signatureTime;
    }
    public void setSignatureTime(String signatureTime) {
        this.signatureTime = signatureTime;
    }
    public String getSignatureValue() {
        return signatureValue;
    }
    public void setSignatureValue(String signatureValue) {
        this.signatureValue = signatureValue;
    }
    public String getSerialNumber() {
        return serialNumber;
    }
    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }
    public String getIssuerDn() {
        return issuerDn;
    }
    public void setIssuerDn(String issuerDn) {
        this.issuerDn = issuerDn;
    }
}