Browse Source

企业微信数据智能专区-总后台配置增加企业名称、完善解密逻辑

cgp 3 ngày trước cách đây
mục cha
commit
e8b73cec02

+ 11 - 0
fs-service/pom.xml

@@ -310,6 +310,17 @@
             <version>4.38.0.ALL</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.70</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.70</version>
+        </dependency>
+
 
     </dependencies>
 

+ 20 - 18
fs-service/src/main/java/com/fs/qw/utils/WeChatSpaceDecryptUtil.java

@@ -1,14 +1,16 @@
 package com.fs.qw.utils;
 
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
+import org.bouncycastle.openssl.PEMParser;
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import javax.crypto.Cipher;
+import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
-import java.security.KeyFactory;
 import java.security.PrivateKey;
-import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.Base64;
 
 @Component
@@ -16,12 +18,6 @@ public class WeChatSpaceDecryptUtil {
 
     private static final Logger log = LoggerFactory.getLogger(WeChatSpaceDecryptUtil.class);
 
-    /**
-     * 解密 encrypted_secret_key
-     * @param encryptedSecretKey Base64 编码的 RSA 密文
-     * @param privateKeyPem PEM 格式私钥字符串(含 -----BEGIN/END-----)
-     * @return 原始 AES 密钥字符串
-     */
     public static String decryptSecretKey(String encryptedSecretKey, String privateKeyPem) throws Exception {
         if (privateKeyPem == null || privateKeyPem.isEmpty()) {
             throw new IllegalArgumentException("私钥不能为空");
@@ -35,15 +31,21 @@ public class WeChatSpaceDecryptUtil {
     }
 
     private static PrivateKey parsePrivateKey(String privateKeyPem) throws Exception {
-        String privateKeyBase64 = privateKeyPem
-                .replace("-----BEGIN PRIVATE KEY-----", "")
-                .replace("-----END PRIVATE KEY-----", "")
-                .replace("-----BEGIN RSA PRIVATE KEY-----", "")
-                .replace("-----END RSA PRIVATE KEY-----", "")
-                .replaceAll("\\s", "");
-        byte[] keyBytes = Base64.getDecoder().decode(privateKeyBase64);
-        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
-        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
-        return keyFactory.generatePrivate(spec);
+        try (PEMParser pemParser = new PEMParser(new StringReader(privateKeyPem))) {
+            Object object = pemParser.readObject();
+            PrivateKeyInfo privateKeyInfo = null;
+            if (object instanceof PrivateKeyInfo) {
+                privateKeyInfo = (PrivateKeyInfo) object;  // PKCS#8
+            } else if (object instanceof org.bouncycastle.openssl.PEMKeyPair) {
+                // PKCS#1 格式
+                org.bouncycastle.openssl.PEMKeyPair keyPair = (org.bouncycastle.openssl.PEMKeyPair) object;
+                privateKeyInfo = keyPair.getPrivateKeyInfo();
+            }
+            if (privateKeyInfo == null) {
+                throw new IllegalArgumentException("Unsupported private key format");
+            }
+            JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
+            return converter.getPrivateKey(privateKeyInfo);
+        }
     }
 }

+ 11 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSessionConfigVo.java

@@ -13,6 +13,9 @@ public class QwSessionConfigVo {
     //企业ID
     private String corpid;
 
+    //企业名称
+    private String corpName;
+
     //(关联专区程序的)自建应用ID
     private String agentid;
 
@@ -38,4 +41,12 @@ public class QwSessionConfigVo {
         private String key;   // 能力标识,例如 "invokeSyncMsg"
         private String value; // 能力具体ID,例如 "invoke_sync_msg"
     }
+
+    public String getPrivateKey() {
+        if (privateKey != null) {
+            // 将存储的转义换行符还原为真实换行
+            return privateKey.replace("\\n", "\n");
+        }
+        return null;
+    }
 }