From 7c080352b0f763b422f939c4a320f8f9a6a26442 Mon Sep 17 00:00:00 2001
From: heheng <heheng@123456>
Date: Thu, 23 Jan 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