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!"); + } +}