From 7c080352b0f763b422f939c4a320f8f9a6a26442 Mon Sep 17 00:00:00 2001 From: heheng <heheng@123456> Date: 星期四, 23 一月 2025 16:52:38 +0800 Subject: [PATCH] sign签名 --- exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java | 34 +++++++++++ exam-system/pom.xml | 6 ++ exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java | 30 ++++++++++ exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java | 82 +++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 0 deletions(-) diff --git a/exam-system/pom.xml b/exam-system/pom.xml index 505b850..713a313 100644 --- a/exam-system/pom.xml +++ b/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> diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java new file mode 100644 index 0000000..2a96c2a --- /dev/null +++ b/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; + + } + +} diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java new file mode 100644 index 0000000..a5fd109 --- /dev/null +++ b/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; + } +} diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java new file mode 100644 index 0000000..a61014e --- /dev/null +++ b/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; + } +} -- Gitblit v1.9.2