From 4350a3894dc74b9eefd5d35e178a79825fb4ad50 Mon Sep 17 00:00:00 2001
From: liyongde <1419499670@qq.com>
Date: Tue, 26 Aug 2025 17:38:24 +0800
Subject: [PATCH] =?UTF-8?q?init:=20=E7=AE=80=E5=8D=95=E7=9A=84=E9=AA=8C?=
=?UTF-8?q?=E8=AF=81=E6=8E=88=E6=9D=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 47 +++++++++++++++++
nl-verify-check-sdk/pom.xml | 39 ++++++++++++++
.../java/org/nl/core/AuthInterceptor.java | 51 +++++++++++++++++++
.../main/java/org/nl/core/LicenseResult.java | 33 ++++++++++++
.../src/main/java/org/nl/core/WebConfig.java | 17 +++++++
.../src/main/java/org/nl/util/RSAUtil.java | 47 +++++++++++++++++
.../src/main/resources/private_key.txt | 1 +
nl-verify-check-test/pom.xml | 28 ++++++++++
.../main/java/org/nl/GenerateAuthCode.java | 33 ++++++++++++
.../src/main/java/org/nl/Main.java | 11 ++++
.../src/main/java/org/nl/RSAKeyGenerator.java | 29 +++++++++++
pom.xml | 22 ++++++++
src/main/java/org/nl/Main.java | 11 ++++
13 files changed, 369 insertions(+)
create mode 100644 .gitignore
create mode 100644 nl-verify-check-sdk/pom.xml
create mode 100644 nl-verify-check-sdk/src/main/java/org/nl/core/AuthInterceptor.java
create mode 100644 nl-verify-check-sdk/src/main/java/org/nl/core/LicenseResult.java
create mode 100644 nl-verify-check-sdk/src/main/java/org/nl/core/WebConfig.java
create mode 100644 nl-verify-check-sdk/src/main/java/org/nl/util/RSAUtil.java
create mode 100644 nl-verify-check-sdk/src/main/resources/private_key.txt
create mode 100644 nl-verify-check-test/pom.xml
create mode 100644 nl-verify-check-test/src/main/java/org/nl/GenerateAuthCode.java
create mode 100644 nl-verify-check-test/src/main/java/org/nl/Main.java
create mode 100644 nl-verify-check-test/src/main/java/org/nl/RSAKeyGenerator.java
create mode 100644 pom.xml
create mode 100644 src/main/java/org/nl/Main.java
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6dab110
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
+/.idea/
+/.idea/.gitignore
+/.idea/compiler.xml
+/.idea/encodings.xml
+/.idea/jarRepositories.xml
+/.idea/misc.xml
+/.idea/uiDesigner.xml
+/.idea/vcs.xml
+/.idea/workspace.xml
diff --git a/nl-verify-check-sdk/pom.xml b/nl-verify-check-sdk/pom.xml
new file mode 100644
index 0000000..91d3fa3
--- /dev/null
+++ b/nl-verify-check-sdk/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+
+ org.nl
+ nl-verify-check
+ 1.0-SNAPSHOT
+
+
+ nl-verify-check-sdk
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 2.7.3
+
+
+ org.projectlombok
+ lombok
+ 1.18.22
+ compile
+
+
+ com.alibaba
+ fastjson
+ 1.2.83
+
+
+
+
diff --git a/nl-verify-check-sdk/src/main/java/org/nl/core/AuthInterceptor.java b/nl-verify-check-sdk/src/main/java/org/nl/core/AuthInterceptor.java
new file mode 100644
index 0000000..c6a0d64
--- /dev/null
+++ b/nl-verify-check-sdk/src/main/java/org/nl/core/AuthInterceptor.java
@@ -0,0 +1,51 @@
+package org.nl.core;
+
+import com.alibaba.fastjson.JSONObject;
+import org.nl.util.RSAUtil;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/26
+ */
+public class AuthInterceptor extends HandlerInterceptorAdapter {
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ String authCode = request.getHeader("cdk"); // 假设从 Header 获取
+
+ if (authCode == null || authCode.isEmpty()) {
+ response.setContentType("text/html;charset=UTF-8");
+ response.setStatus(402);
+ response.getWriter().write(JSONObject.toJSONString(LicenseResult.requestResult(false, "请收入授权码", null)));
+ return false;
+ }
+ String expirationStr ="";
+ try {
+ // 解密获取到期时间
+ expirationStr = RSAUtil.decrypt(authCode);
+ if ("-1".equals(expirationStr)) {
+ return true;
+ }
+ LocalDate expirationDate = LocalDate.parse(expirationStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ if (LocalDate.now().isAfter(expirationDate)) {
+ response.setContentType("text/html;charset=UTF-8");
+ response.setStatus(402);
+ response.getWriter().write(JSONObject.toJSONString(LicenseResult.requestResult(false, "授权码已到期", null)));
+ return false;
+ }
+ } catch (Exception e) {
+ // 解密失败或格式错误
+ response.setContentType("text/html;charset=UTF-8");
+ response.setStatus(402);
+ response.getWriter().write(JSONObject.toJSONString(LicenseResult.requestResult(false, "解密失败或格式错误", null)));
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/nl-verify-check-sdk/src/main/java/org/nl/core/LicenseResult.java b/nl-verify-check-sdk/src/main/java/org/nl/core/LicenseResult.java
new file mode 100644
index 0000000..add9845
--- /dev/null
+++ b/nl-verify-check-sdk/src/main/java/org/nl/core/LicenseResult.java
@@ -0,0 +1,33 @@
+package org.nl.core;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/14
+ */
+@Data
+@Builder
+public class LicenseResult {
+ /** 检验结果 */
+ private Boolean result;
+ /** 附加信息 */
+ private String message;
+ /** 证书key */
+ private String content;
+ public static LicenseResult requestResult(Boolean result, String message, String content) {
+ return LicenseResult.builder()
+ .message(message)
+ .result(result)
+ .content(content)
+ .build();
+ }
+ public static LicenseResult requestOk(String message, String content) {
+ return LicenseResult.builder()
+ .message(message)
+ .result(true)
+ .content(content)
+ .build();
+ }
+}
diff --git a/nl-verify-check-sdk/src/main/java/org/nl/core/WebConfig.java b/nl-verify-check-sdk/src/main/java/org/nl/core/WebConfig.java
new file mode 100644
index 0000000..da45213
--- /dev/null
+++ b/nl-verify-check-sdk/src/main/java/org/nl/core/WebConfig.java
@@ -0,0 +1,17 @@
+package org.nl.core;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/26
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**");
+ }
+}
diff --git a/nl-verify-check-sdk/src/main/java/org/nl/util/RSAUtil.java b/nl-verify-check-sdk/src/main/java/org/nl/util/RSAUtil.java
new file mode 100644
index 0000000..e67f8a8
--- /dev/null
+++ b/nl-verify-check-sdk/src/main/java/org/nl/util/RSAUtil.java
@@ -0,0 +1,47 @@
+package org.nl.util;
+
+import org.springframework.util.ResourceUtils;
+
+import javax.crypto.Cipher;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/13
+ */
+public class RSAUtil {
+ private static PrivateKey privateKey;
+
+ public static synchronized PrivateKey getPrivateKey() throws Exception {
+ if (privateKey == null) {
+ // 从 resources/private_key.txt 读取 Base64
+ String filePath = ResourceUtils.getFile("classpath:private_key.txt").getPath();
+ BufferedReader reader = new BufferedReader(new FileReader(filePath));
+ StringBuilder sb = new StringBuilder();
+ String line;
+ while ((line = reader.readLine()) != null) {
+ sb.append(line);
+ }
+ reader.close();
+
+ byte[] privateKeyBytes = Base64.getDecoder().decode(sb.toString());
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ privateKey = keyFactory.generatePrivate(keySpec);
+ }
+ return privateKey;
+ }
+
+ public static String decrypt(String authCode) throws Exception {
+ byte[] encryptedBytes = Base64.getDecoder().decode(authCode);
+ Cipher cipher = Cipher.getInstance("RSA");
+ cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
+ byte[] decrypted = cipher.doFinal(encryptedBytes);
+ return new String(decrypted, "UTF-8");
+ }
+}
diff --git a/nl-verify-check-sdk/src/main/resources/private_key.txt b/nl-verify-check-sdk/src/main/resources/private_key.txt
new file mode 100644
index 0000000..7ae8272
--- /dev/null
+++ b/nl-verify-check-sdk/src/main/resources/private_key.txt
@@ -0,0 +1 @@
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCBbWQ38mZdmOX379myX/NFn/qFIeP3kbogDiWlGtc1JNt6eDSsOEShUNj3o8Jo5Qaepyo6j4stP4WpmCAUFsdyOodzU0R60P7gFOR1OIdKyyQ2OS9J1MdNXRRuksfD1WVG+azoB+huQo2D52bcXSjnu1UDRDrXN3XXZgh1L2V/aDg+Gi9QAIsMDHtN62zKsHs4tlClHt0KORSdAxN9RjPzUFNYXfxW3dNTM9zfltoM2bgeUfG61F5EMipkAEVjDb4+Pu2BsNUamjy85eKDWA8NxDU6uuDkxLNiLx5KipLxOR+EM4/cOqRwHdEj8matpGlqBSOfOxXd6Sh5XmVStBjtAgMBAAECggEAQCbcme6IVrRGqJI2MXfluQkGv56AxGFzBBh/CEs5iJnwP8/9K6/oNJ1CLdz5q8x5b4IkKEqmDZOCyQEiRVLVIQVpxfvr4YReEOvKIWAXjzcJh+boTYwuDWapjfUrFyJaxMdUsN3ak2xhgJPeJDP45oOwK6JSGALhYhas8oi/olptl3leZs/5Z3h9UE69u80XRdhjtGyfS3AOOtT6dVcfKw6H8tmoKmx43ZfPvoV+a7hcwHO587mI1epAhYGOn81e5QoNBegiCEv9KutuZtauJuGHKcsvNh/FK8QujRJ1TFxOsMtxsJWZfxQxUuvJ0PulCpGpmkuHFNGDmV3ukJO1AQKBgQC8eiTaWgq8eCrIOi5fYtXQUmzv2e5BOhMrRyUWoB30N7GmKcdNGT5HJVXztidcBj53cNd8T6t5yTwYFrdZ5Lll7ItPAub25CSnGQU2nmceHK+46PNlQfLZRrlyeUuGYJTHVZanV+6Pneqn+6XifTa969HzpejpiJuG8iYVmcztfQKBgQCvy5ha6tBS+sIrjXL8/lrxXMDm4xT3CnCLmBqInppLwfFOgcQFzYWL6SQSJ7k3uC+xFT++VgsRLz/pQrVLsQzkY6mUF8sI7F0kevy/jAFzl9cgFn9BXu1ATyWloQIAX/UdSbzSWxIH3BW3BNOWZ0x91HUqBDAFzyLBkIns8LZ0MQKBgQCyg9oN+kS69/JFjV3IuLsdQkSt9LNGknP/hLYrNOLKIkofwOhlLOigyEsdt0SWU8+sn3Np6afXhPNnOXTWLt4vHJlh77TE2ZehsQAQGH5Athj1waZvHMSgaO1S8HHJSAcCuh0kSRPKcV8FVkNrPv+vaQGFjXoKX3o3mXja8r53nQKBgQCElQVj1GKnoo1csYJ+wgqurCikObFvG8WD0oR4cz2lUzD956qCQd2thnj45FKxbk0xvffkQhp4rG0ELJZ07qPtgCi+Ey/CnBknUUZb5GiX2HWbsrvo/oHqlYasIwFSbQx9OUaaU6sGmHscHBzD+0ZaRCjVNnFNgEoTOEJ9m5HPkQKBgQC0Kd29rQMIm5wXhIyW+bVdwmEyB/Xuq6Ch7lVVfZ6WMSoDbQZdYH3Mxw+yzjYpcS8jf/7x7mYH9Z0ggXwX7CAcRqhpjtKU800KzwQ2Cnd7Jmgq56Mn/e70J4btH73EZB6sm7vmhIuBZZlvc3oYGeJN/t/9vLwomFqrlXVw318J2A==
diff --git a/nl-verify-check-test/pom.xml b/nl-verify-check-test/pom.xml
new file mode 100644
index 0000000..0275fb7
--- /dev/null
+++ b/nl-verify-check-test/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+
+ org.nl
+ nl-verify-check
+ 1.0-SNAPSHOT
+
+
+ nl-verify-check-test
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ org.nl
+ nl-verify-check-sdk
+ 1.0-SNAPSHOT
+
+
+
+
diff --git a/nl-verify-check-test/src/main/java/org/nl/GenerateAuthCode.java b/nl-verify-check-test/src/main/java/org/nl/GenerateAuthCode.java
new file mode 100644
index 0000000..4679068
--- /dev/null
+++ b/nl-verify-check-test/src/main/java/org/nl/GenerateAuthCode.java
@@ -0,0 +1,33 @@
+package org.nl;
+
+import javax.crypto.Cipher;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/13
+ */
+public class GenerateAuthCode {
+ public static void main(String[] args) throws Exception {
+ String publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgW1kN/JmXZjl9+/Zsl/zRZ/6hSHj95G6IA4lpRrXNSTbeng0rDhEoVDY96PCaOUGnqcqOo+LLT+FqZggFBbHcjqHc1NEetD+4BTkdTiHSsskNjkvSdTHTV0UbpLHw9VlRvms6AfobkKNg+dm3F0o57tVA0Q61zd112YIdS9lf2g4PhovUACLDAx7TetsyrB7OLZQpR7dCjkUnQMTfUYz81BTWF38Vt3TUzPc35baDNm4HlHxutReRDIqZABFYw2+Pj7tgbDVGpo8vOXig1gPDcQ1Orrg5MSzYi8eSoqS8TkfhDOP3DqkcB3RI/JmraRpagUjnzsV3ekoeV5lUrQY7QIDAQAB"; // 从生成器中获取
+ String expirationDate = "2025-12-31"; // 到期时间原文
+
+ // 还原公钥
+ byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyBase64);
+ X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ PublicKey publicKey = keyFactory.generatePublic(keySpec);
+
+ // 加密
+// Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 标准填充模式
+ Cipher cipher = Cipher.getInstance("RSA"); // 标准填充模式
+ cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ byte[] encrypted = cipher.doFinal(expirationDate.getBytes("UTF-8"));
+ String authCode = Base64.getEncoder().encodeToString(encrypted);
+
+ System.out.println("授权码: " + authCode);
+ }
+}
diff --git a/nl-verify-check-test/src/main/java/org/nl/Main.java b/nl-verify-check-test/src/main/java/org/nl/Main.java
new file mode 100644
index 0000000..f5a7db3
--- /dev/null
+++ b/nl-verify-check-test/src/main/java/org/nl/Main.java
@@ -0,0 +1,11 @@
+package org.nl;
+
+/**
+ * @Author: lyd
+ * @Date: ${DATE}
+ */
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("Hello world!");
+ }
+}
diff --git a/nl-verify-check-test/src/main/java/org/nl/RSAKeyGenerator.java b/nl-verify-check-test/src/main/java/org/nl/RSAKeyGenerator.java
new file mode 100644
index 0000000..1894094
--- /dev/null
+++ b/nl-verify-check-test/src/main/java/org/nl/RSAKeyGenerator.java
@@ -0,0 +1,29 @@
+package org.nl;
+
+import java.security.*;
+import java.util.Base64;
+
+/**
+ * @Author: lyd
+ * @Date: 2025/8/13
+ */
+public class RSAKeyGenerator {
+ public static void main(String[] args) {
+ try {
+ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
+ keyGen.initialize(2048); // 推荐 2048 位密钥,安全级别高
+ KeyPair pair = keyGen.generateKeyPair();
+ PrivateKey privateKey = pair.getPrivate();
+ PublicKey publicKey = pair.getPublic();
+
+ // Base64 编码,便于存储和传输
+ String privateKeyBase64 = Base64.getEncoder().encodeToString(privateKey.getEncoded());
+ String publicKeyBase64 = Base64.getEncoder().encodeToString(publicKey.getEncoded());
+
+ System.out.println("Private Key (Base64): " + privateKeyBase64);
+ System.out.println("Public Key (Base64): " + publicKeyBase64);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..73a9f5c
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+
+ org.nl
+ nl-verify-check
+ 1.0-SNAPSHOT
+ pom
+
+ nl-verify-check-sdk
+ nl-verify-check-test
+
+
+
+ 8
+ 8
+ UTF-8
+
+
+
diff --git a/src/main/java/org/nl/Main.java b/src/main/java/org/nl/Main.java
new file mode 100644
index 0000000..f5a7db3
--- /dev/null
+++ b/src/main/java/org/nl/Main.java
@@ -0,0 +1,11 @@
+package org.nl;
+
+/**
+ * @Author: lyd
+ * @Date: ${DATE}
+ */
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("Hello world!");
+ }
+}