Prechádzať zdrojové kódy

请求体响应体加密,配置文件自动解密

李亚非 3 mesiacov pred
rodič
commit
6af3c7ea4c

+ 1 - 1
alien-store/src/main/java/shop/alien/store/AlienStoreApplication.java

@@ -8,7 +8,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
-@ComponentScan({"shop.alien.store.*","shop.alien.util.*","shop.alien.config.http","shop.alien.config.properties","shop.alien.config.advice"})
+@ComponentScan({"shop.alien.store.*","shop.alien.util.*","shop.alien.config.http","shop.alien.config.properties"})
 @EnableSwaggerBootstrapUI
 @MapperScan({"shop.alien.mapper"})
 @SpringBootApplication

+ 44 - 10
alien-store/src/main/java/shop/alien/store/controller/StorePriceController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreInfo;
@@ -14,8 +15,11 @@ import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.store.service.StorePriceService;
 import shop.alien.util.encryption.Decrypt;
 import shop.alien.util.encryption.Encrypt;
+import shop.alien.util.encryption.JasyptEncryptorUtil;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 通用价目表
@@ -36,6 +40,45 @@ public class StorePriceController {
 
     private final StoreInfoMapper storeInfoMapper;
 
+    @Value("${test1}")
+    private String dbPassword;
+
+    @ApiOperation("测试读取配置与手动加解密")
+    @GetMapping("/testConfig")
+    public R<Map<String, Object>> testConfig(@RequestParam String salt, @RequestParam String text) {
+        Map<String, Object> result = new HashMap<>();
+        
+        // 1. 测试自动解密(Jasypt 注入的结果)
+        result.put("configPassword", dbPassword);
+
+        // 2. 调用 utils 里的封装进行手动加解密逻辑
+        try {
+            String encrypted = JasyptEncryptorUtil.encode(salt, text);
+            String decrypted = JasyptEncryptorUtil.decode(salt, encrypted);
+
+            result.put("inputSalt", salt);
+            result.put("inputText", text);
+            result.put("manualEncrypted", encrypted);
+            result.put("manualDecrypted", decrypted);
+        } catch (Exception e) {
+            return R.fail("加解密调试失败: " + e.getMessage());
+        }
+
+        return R.data(result, "调试成功");
+    }
+
+    @ApiOperation("加解密测试接口")
+    @ApiOperationSupport(order = 10)
+    @PostMapping("/testEncryption")
+    @Decrypt
+    @Encrypt
+    public R<StorePrice> testEncryption(@RequestBody StorePrice storePrice) {
+        log.info("加解密测试接口接收数据: {}", storePrice);
+        // 原样返回,测试响应加密
+        return R.data(storePrice, "加解密测试成功");
+    }
+
+
     @ApiOperation("新增通用价目")
     @ApiOperationSupport(order = 1)
     @PostMapping("/save")
@@ -243,15 +286,6 @@ public class StorePriceController {
         return R.fail("操作失败");
     }
 
-    @ApiOperation("加解密测试接口")
-    @ApiOperationSupport(order = 10)
-    @PostMapping("/testEncryption")
-    @Decrypt
-    @Encrypt
-    public R<StorePrice> testEncryption(@RequestBody StorePrice storePrice) {
-        log.info("加解密测试接口接收数据: {}", storePrice);
-        // 原样返回,测试响应加密
-        return R.data(storePrice, "加解密测试成功");
-    }
+
 }
 

+ 12 - 2
alien-util/pom.xml

@@ -14,8 +14,8 @@
     <description>alien-util</description>
 
     <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     </properties>
@@ -33,6 +33,11 @@
 <!--        </dependency>-->
 
         <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
@@ -335,6 +340,11 @@
             <artifactId>spring-cloud-context</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.ulisesbocchio</groupId>
+            <artifactId>jasypt-spring-boot-starter</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 47 - 0
alien-util/src/main/java/shop/alien/util/encryption/JasyptAutoConfiguration.java

@@ -0,0 +1,47 @@
+package shop.alien.util.encryption;
+
+import org.jasypt.encryption.StringEncryptor;
+import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
+import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import shop.alien.util.encryption.properties.EncryptProperties;
+
+/**
+ * Jasypt 自动配置类 - 只要依赖 alien-util 即可自动生效
+ */
+@Configuration
+@EnableConfigurationProperties(EncryptProperties.class)
+public class JasyptAutoConfiguration {
+
+    public static final String ALGORITHM = "PBEWithMD5AndDES";
+
+    @Bean("jasyptStringEncryptor")
+    public StringEncryptor stringEncryptor() {
+        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
+        encryptor.setConfig(createConfig());
+        return encryptor;
+    }
+
+    /**
+     * 提取公共配置逻辑,供自动注入使用
+     */
+    private SimpleStringPBEConfig createConfig() {
+        String pwd = System.getProperty("jasypt.encryptor.password");
+        if (pwd == null || pwd.isEmpty()) {
+            pwd = ""; 
+        }
+
+        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
+        config.setPassword(pwd);
+        config.setAlgorithm(ALGORITHM);
+        config.setKeyObtentionIterations("1000");
+        config.setPoolSize("1");
+        config.setProviderName("SunJCE");
+        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
+        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
+        config.setStringOutputType("base64");
+        return config;
+    }
+}

+ 33 - 0
alien-util/src/main/java/shop/alien/util/encryption/JasyptEncryptorUtil.java

@@ -0,0 +1,33 @@
+package shop.alien.util.encryption;
+
+import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
+import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
+import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
+
+/**
+ * Jasypt 统一加解密工具类
+ */
+public class JasyptEncryptorUtil {
+
+    /**
+     * 手动加密
+     * @param salt 盐值
+     * @param text 待加密文本
+     * @return 密文
+     */
+    public static String encode(String salt, String text) {
+        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
+        encryptor.setAlgorithm(JasyptAutoConfiguration.ALGORITHM);
+        encryptor.setPassword(salt); // 直接设置盐值,不经过 Config 对象
+        encryptor.setIvGenerator(new org.jasypt.iv.NoIvGenerator());
+        return encryptor.encrypt(text);
+    }
+
+    public static String decode(String salt, String cipherText) {
+        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
+        encryptor.setAlgorithm(JasyptAutoConfiguration.ALGORITHM);
+        encryptor.setPassword(salt); // 直接设置盐值
+        encryptor.setIvGenerator(new org.jasypt.iv.NoIvGenerator());
+        return encryptor.decrypt(cipherText);
+    }
+}

+ 2 - 2
alien-config/src/main/java/shop/alien/config/advice/DecryptRequestBodyAdvice.java → alien-util/src/main/java/shop/alien/util/encryption/advice/DecryptRequestBodyAdvice.java

@@ -1,4 +1,4 @@
-package shop.alien.config.advice;
+package shop.alien.util.encryption.advice;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.MethodParameter;
@@ -8,9 +8,9 @@ import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.util.StreamUtils;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
-import shop.alien.config.properties.EncryptProperties;
 import shop.alien.util.encryption.Decrypt;
 import shop.alien.util.encryption.StandardAesUtil;
+import shop.alien.util.encryption.properties.EncryptProperties;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;

+ 2 - 2
alien-config/src/main/java/shop/alien/config/advice/EncryptResponseBodyAdvice.java → alien-util/src/main/java/shop/alien/util/encryption/advice/EncryptResponseBodyAdvice.java

@@ -1,4 +1,4 @@
-package shop.alien.config.advice;
+package shop.alien.util.encryption.advice;
 
 import com.alibaba.fastjson.JSON;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,9 +9,9 @@ import org.springframework.http.server.ServerHttpRequest;
 import org.springframework.http.server.ServerHttpResponse;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
-import shop.alien.config.properties.EncryptProperties;
 import shop.alien.util.encryption.Encrypt;
 import shop.alien.util.encryption.StandardAesUtil;
+import shop.alien.util.encryption.properties.EncryptProperties;
 
 /**
  * 响应体加密 Advice

+ 1 - 2
alien-config/src/main/java/shop/alien/config/properties/EncryptProperties.java → alien-util/src/main/java/shop/alien/util/encryption/properties/EncryptProperties.java

@@ -1,4 +1,4 @@
-package shop.alien.config.properties;
+package shop.alien.util.encryption.properties;
 
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -9,7 +9,6 @@ import org.springframework.stereotype.Component;
  * 加解密配置属性
  */
 @Data
-@Component
 @RefreshScope
 @ConfigurationProperties(prefix = "alien.encrypt")
 public class EncryptProperties {

+ 2 - 0
alien-util/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+shop.alien.util.encryption.JasyptAutoConfiguration

+ 8 - 0
pom.xml

@@ -30,6 +30,7 @@
         <spring-cloud-nacos.version>2.2.5.RELEASE</spring-cloud-nacos.version>
         <spring.cloud.version>Hoxton.SR1</spring.cloud.version>
         <mybatisplus.version>3.2.0</mybatisplus.version>
+        <jasypt.version>3.0.3</jasypt.version>
     </properties>
 
     <dependencyManagement>
@@ -392,6 +393,13 @@
                 <version>${spring-boot.version}</version>
             </dependency>
 
+            <!-- Jasypt Encryption -->
+            <dependency>
+                <groupId>com.github.ulisesbocchio</groupId>
+                <artifactId>jasypt-spring-boot-starter</artifactId>
+                <version>${jasypt.version}</version>
+            </dependency>
+
             <!--Other End-->
         </dependencies>
     </dependencyManagement>