From 559c08a557216ac0b940c7d030032a107cc13871 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Fri, 6 Jun 2025 08:47:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E9=9B=86=E6=88=90=E4=BB=A3=E7=A0=812025-06?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 20 +- .../com/stdproject/ProjectApplication.java | 4 +- .../service/impl/DynamicDataServiceImpl.java | 3 +- .../service/provider/CalciteProvider.java | 15 +- .../java/com/stdproject/utils/CodingUtil.java | 210 ++++++++++++++++++ .../com/stdproject/utils/EncryptUtils.java | 44 ++++ 6 files changed, 277 insertions(+), 19 deletions(-) create mode 100644 backend/src/main/java/com/stdproject/utils/CodingUtil.java create mode 100644 backend/src/main/java/com/stdproject/utils/EncryptUtils.java diff --git a/backend/pom.xml b/backend/pom.xml index aeb0487..ba55f4b 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -18,9 +18,11 @@ 21 21 21 - 3.5.3 + 3.0.3 + 3.5.6 0.11.5 2.0.2 + 1.35.18 @@ -57,6 +59,11 @@ ${project.basedir}/libs/sdk-bundle-2.0.jar + + org.mybatis + mybatis-spring + ${mybatis-spring.version} + com.baomidou mybatis-plus-boot-starter @@ -118,18 +125,9 @@ org.projectlombok lombok + 1.18.34 provided - - com.baomidou - mybatis-plus-core - 3.5.3.1 - - - org.projectlombok - lombok - 1.18.34 provided - diff --git a/backend/src/main/java/com/stdproject/ProjectApplication.java b/backend/src/main/java/com/stdproject/ProjectApplication.java index f936d25..57071e9 100644 --- a/backend/src/main/java/com/stdproject/ProjectApplication.java +++ b/backend/src/main/java/com/stdproject/ProjectApplication.java @@ -13,8 +13,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; * @author StdProject * @since 2023-12-07 */ -@SpringBootApplication(scanBasePackages = {"com.stdproject", "io.gisbi.extensions.datasource.utils", "io.gisbi.i18n"}) -@MapperScan("com.stdproject.mapper") +@SpringBootApplication(scanBasePackages = {"com.stdproject","io.gisbi.rsa", "io.gisbi.utils", "io.gisbi.extensions"}) +@MapperScan("com.stdproject.mapper,io.gisbi.rsa.dao.mapper") @EnableCaching @EnableAsync @EnableTransactionManagement diff --git a/backend/src/main/java/com/stdproject/service/impl/DynamicDataServiceImpl.java b/backend/src/main/java/com/stdproject/service/impl/DynamicDataServiceImpl.java index 3374450..f845ded 100644 --- a/backend/src/main/java/com/stdproject/service/impl/DynamicDataServiceImpl.java +++ b/backend/src/main/java/com/stdproject/service/impl/DynamicDataServiceImpl.java @@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; - +import com.stdproject.utils.EncryptUtils; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -33,6 +33,7 @@ public class DynamicDataServiceImpl implements IDynamicDataService { public boolean addTableData(Long datasourceId, String tableData) throws Exception { // 根据数据源 id 查询数据源信息,调用通用数据源执行器 CoreDatasource coreDatasource = coreDatasourceMapper.selectById(datasourceId); + coreDatasource.setConfiguration(String.valueOf(EncryptUtils.aesDecrypt(coreDatasource.getConfiguration()))); if (coreDatasource == null) { BusinessException.throwException("数据源不存在"); } diff --git a/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java b/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java index dcefeb8..f7d61bb 100644 --- a/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java +++ b/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java @@ -745,11 +745,16 @@ public class CalciteProvider extends Provider { private Connection getCalciteConnection() { registerDriver(); Properties info = new Properties(); - info.setProperty(CalciteConnectionProperty.LEX.camelName(), "JAVA"); - info.setProperty(CalciteConnectionProperty.FUN.camelName(), "all"); - info.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(), "false"); - info.setProperty(CalciteConnectionProperty.PARSER_FACTORY.camelName(), "org.apache.calcite.sql.parser.impl.SqlParserImpl#FACTORY"); - info.setProperty(CalciteConnectionProperty.DEFAULT_NULL_COLLATION.camelName(), NullCollation.LAST.name()); +// info.setProperty(CalciteConnectionProperty.LEX.camelName(), "JAVA"); +// info.setProperty(CalciteConnectionProperty.FUN.camelName(), "all"); +// info.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(), "false"); +// info.setProperty(CalciteConnectionProperty.PARSER_FACTORY.camelName(), "org.apache.calcite.sql.parser.impl.SqlParserImpl#FACTORY"); +// info.setProperty(CalciteConnectionProperty.DEFAULT_NULL_COLLATION.camelName(), NullCollation.LAST.name()); + info.setProperty("lex", "JAVA"); + info.setProperty("fun", "all"); + info.setProperty("caseSensitive", "false"); + info.setProperty("parserFactory", "org.apache.calcite.sql.parser.impl.SqlParserImpl#FACTORY"); + info.setProperty("defaultNullCollation", NullCollation.LAST.name()); info.setProperty("remarks", "true"); Connection connection = null; try { diff --git a/backend/src/main/java/com/stdproject/utils/CodingUtil.java b/backend/src/main/java/com/stdproject/utils/CodingUtil.java new file mode 100644 index 0000000..1884ea0 --- /dev/null +++ b/backend/src/main/java/com/stdproject/utils/CodingUtil.java @@ -0,0 +1,210 @@ +package com.stdproject.utils; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.MessageDigest; +import java.util.UUID; + +/** + * 加密解密工具 + * + * @Author bi-coder + */ +public class CodingUtil { + + private static final String UTF_8 = "UTF-8"; + + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + + public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z" }; + /** + * MD5加密 + * + * @param src 要加密的串 + * @return 加密后的字符串 + */ + public static String md5(String src) { + return md5(src, UTF_8); + } + + /** + * MD5加密 + * + * @param src 要加密的串 + * @param charset 加密字符集 + * @return 加密后的字符串 + */ + public static String md5(String src, String charset) { + try { + byte[] strTemp = StringUtils.isEmpty(charset) ? src.getBytes() : src.getBytes(charset); + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(strTemp); + + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + + for (byte byte0 : md) { + str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf]; + str[k++] = HEX_DIGITS[byte0 & 0xf]; + } + + return new String(str); + } catch (Exception e) { + throw new RuntimeException("MD5 encrypt error:", e); + } + } + + /** + * BASE64解密 + * + * @param src 待解密的字符串 + * @return 解密后的字符串 + */ + public static String base64Decoding(String src) { + byte[] b; + String result = null; + if (src != null) { + try { + b = Base64.decodeBase64(src); + result = new String(b, UTF_8); + } catch (Exception e) { + throw new RuntimeException("BASE64 decoding error:", e); + } + } + return result; + } + + /** + * BASE64加密 + * + * @param src 待加密的字符串 + * @return 加密后的字符串 + */ + public static String base64Encoding(String src) { + String result = null; + if (src != null) { + try { + result = Base64.encodeBase64String(src.getBytes(UTF_8)); + } catch (Exception e) { + throw new RuntimeException("BASE64 encoding error:", e); + } + } + return result; + } + + /** + * AES加密 + * + * @param src 待加密字符串 + * @param secretKey 密钥 + * @param iv 向量 + * @return 加密后字符串 + */ + public static String aesEncrypt(String src, String secretKey, String iv) { + if (StringUtils.isBlank(secretKey)) { + throw new RuntimeException("secretKey is empty"); + } + + try { + byte[] raw = secretKey.getBytes(UTF_8); + SecretKeySpec secretKeySpec = new SecretKeySpec(raw, "AES"); + // "算法/模式/补码方式" ECB + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + IvParameterSpec iv1 = new IvParameterSpec(iv.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv1); + byte[] encrypted = cipher.doFinal(src.getBytes(UTF_8)); + return Base64.encodeBase64String(encrypted); + } catch (Exception e) { + throw new RuntimeException("AES encrypt error:", e); + } + + } + + /** + * AES 解密 + * + * @param src 待解密字符串 + * @param secretKey 密钥 + * @param iv 向量 + * @return 解密后字符串 + */ + public static String aesDecrypt(String src, String secretKey, String iv) { + if (StringUtils.isBlank(secretKey)) { + throw new RuntimeException("secretKey is empty"); + } + try { + byte[] raw = secretKey.getBytes(UTF_8); + SecretKeySpec secretKeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + IvParameterSpec iv1 = new IvParameterSpec(iv.getBytes()); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv1); + byte[] encrypted1 = Base64.decodeBase64(src); + byte[] original = cipher.doFinal(encrypted1); + return new String(original, UTF_8); + } catch (BadPaddingException | IllegalBlockSizeException e) { + // 解密的原字符串为非加密字符串,则直接返回原字符串 + return src; + } catch (Exception e) { + throw new RuntimeException("decrypt error,please check parameters", e); + } + } + + + public static String secretKey() { + try { + KeyGenerator keyGen = KeyGenerator.getInstance("AES"); + keyGen.init(128); + SecretKey secretKey = keyGen.generateKey(); + return Base64.encodeBase64String(secretKey.getEncoded()); + } catch (Exception e) { + throw new RuntimeException("generate secretKey error", e); + } + + } + + public static boolean isNumeric(String str){ + for (int i = str.length();--i>=0;){ + if (!Character.isDigit(str.charAt(i))){ + return false; + } + } + return true; + } + + + + public static String shortUuid() { + StringBuffer shortBuffer = new StringBuffer(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + for (int i = 0; i < 8; i++) { + String str = uuid.substring(i * 4, i * 4 + 4); + int x = Integer.parseInt(str, 16); + shortBuffer.append(chars[x % 0x3E]); + } + return shortBuffer.toString(); + } + + public static Integer string2Integer(String str) { + StringBuffer sb = new StringBuffer(); + if (StringUtils.isBlank(str)) return null; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (Character.isDigit(c)) { + sb.append(c); + } + } + return sb.length() > 0 ? Integer.parseInt(sb.toString()) : null; + } +} diff --git a/backend/src/main/java/com/stdproject/utils/EncryptUtils.java b/backend/src/main/java/com/stdproject/utils/EncryptUtils.java new file mode 100644 index 0000000..f588dde --- /dev/null +++ b/backend/src/main/java/com/stdproject/utils/EncryptUtils.java @@ -0,0 +1,44 @@ +package com.stdproject.utils; + +import io.gisbi.utils.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +public class EncryptUtils extends CodingUtil { + + private static final String secretKey = "www.fit2cloud.co"; + private static final String iv = "1234567890123456"; + + + public static Object aesEncrypt(Object o) { + if (o == null) { + return null; + } + return aesEncrypt(o.toString(), secretKey, iv); + } + + public static Object aesDecrypt(Object o) { + if (o == null) { + return null; + } + return aesDecrypt(o.toString(), secretKey, iv); + } + + public static Object aesDecrypt(List o, String attrName) { + if (o == null) { + return null; + } + return o.stream() + .filter(element -> BeanUtils.getFieldValueByName(attrName, element) != null) + .peek(element -> BeanUtils.setFieldValueByName(element, attrName, aesDecrypt(BeanUtils.getFieldValueByName(attrName, element).toString(), secretKey, iv), String.class)) + .collect(Collectors.toList()); + } + + public static Object md5Encrypt(Object o) { + if (o == null) { + return null; + } + return md5(o.toString()); + } +}