国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深度揭秘:Spring Boot 實現接口數據加解密的三種實戰方案

安全 應用安全
無論哪種方案,都需注意密鑰安全和異常處理。通過本文的源碼示例,開發者可快速在項目中落地接口數據加解密功能,在保障數據安全的同時,最小化對現有業務的影響。

一、為什么需要接口數據加解密?

在金融支付、用戶隱私信息傳輸等場景中,接口數據若以明文傳輸,極易被中間人攻擊竊取。例如:

  • 用戶登錄時的密碼、身份證號等敏感信息
  • 企業間數據交互的核心業務參數
  • 移動端與后臺交互的 token 憑證

Spring Boot 提供了多種優雅的加解密實現方案,既能保證數據安全,又能最小化業務侵入性。本文將從原理到實戰,帶你掌握三種主流實現方式。

二、核心加解密算法選擇

1. 對稱加密(AES)

優勢:加密速度快,適合大流量數據傳輸缺點:密鑰需安全存儲,適合客戶端與服務端一對一場景

// AES 工具類(128位密鑰)
public class AESUtils {
    private static final String KEY = "your_16bit_secret_key";
    private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
    public static String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(KEY.getBytes(), "AES"));
        return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
    }
    public static String decrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(KEY.getBytes(), "AES"));
        return new String(cipher.doFinal(Base64.getDecoder().decode(data)));
    }
}

2. 非對稱加密(RSA)

優勢:密鑰對機制,適合證書認證場景缺點:加密效率低,通常用于加密對稱密鑰

// RSA 工具類(生成公鑰私鑰對)
public class RSAUtils {
    private static final int KEY_SIZE = 1024;
    private static final String ALGORITHM = "RSA";
    public static Map<String, String> generateKeyPair() throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM);
        generator.initialize(KEY_SIZE);
        KeyPair pair = generator.generateKeyPair();
        return Map.of(
            "publicKey", Base64.getEncoder().encodeToString(pair.getPublic().getEncoded()),
            "privateKey", Base64.getEncoder().encodeToString(pair.getPrivate().getEncoded())
        );
    }
}

三、實戰方案一:基于 AOP 的透明加解密

1. 核心原理

通過自定義注解標記需要加解密的接口,利用 Spring AOP 在方法調用前后自動處理加解密邏輯,實現業務代碼零侵入。

2. 實現步驟

(1)定義加解密注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
    // 排除字段(如時間戳等無需加密字段)
    String[] excludeFields() default {};
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Decrypt {
    // 解密失敗是否拋出異常
    boolean throwOnFailure() default true;
}

(2)編寫 AOP 切面

@Aspect
@Component
public class DataEncryptAspect {
    @Around("@annotation(Encrypt)")
    public Object encryptAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 執行原始方法
        Object result = joinPoint.proceed();
        // 對響應結果進行AES加密
        return AESUtils.encrypt(JSON.toJSONString(result));
    }
    @Around("@annotation(Decrypt)")
    public Object decryptAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 獲取請求參數(假設參數為JSON字符串)
        Object[] args = joinPoint.getArgs();
        String encryptedData = (String) args[0];
        // 解密請求參數
        String decryptedData = AESUtils.decrypt(encryptedData);
        // 替換原始參數為解密后的數據
        args[0] = decryptedData;
        return joinPoint.proceed(args);
    }
}

(3)控制器使用示例

@RestController
@RequestMapping("/api")
public class UserController {
    @PostMapping("/register")
    @Decrypt
    public UserRegisterResponse register(@RequestBody String encryptedData) {
        // 處理解密后的明文數據
        UserRegisterRequest request = JSON.parseObject(encryptedData, UserRegisterRequest.class);
        // 業務邏輯...
        return new UserRegisterResponse("注冊成功", request.getUserId());
    }
    @GetMapping("/profile")
    @Encrypt
    public UserProfile getProfile(@RequestParam String userId) {
        // 業務邏輯獲取用戶信息
        return new UserProfile("張三", "138****1234");
    }
}

3. 方案優勢

  • 低侵入性:僅需在接口方法添加注解
  • 靈活配置:可自定義排除字段和異常處理策略
  • 適用場景:適合對單個接口細粒度控制的場景

四、實戰方案二:全局過濾器實現請求響應加解密

1. 核心原理

通過實現 Filter 或 HandlerInterceptor,在請求進入控制器前解密參數,響應離開前加密結果,實現全局統一加解密。

2. 實現步驟

(1)自定義加解密過濾器

@Component
public class DataEncryptFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        // 處理請求解密(假設請求體為加密的JSON)
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String encryptedBody = IOUtils.toString(httpRequest.getInputStream(), StandardCharsets.UTF_8);
        String decryptedBody = AESUtils.decrypt(encryptedBody);


        // 包裝請求體為可重復讀取的流
        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest, decryptedBody);


        // 處理響應加密
        final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper((HttpServletResponse) response, buffer);


        chain.doFilter(requestWrapper, responseWrapper);


        // 對響應結果加密并寫出
        String encryptedResult = AESUtils.encrypt(buffer.toString());
        response.getWriter().write(encryptedResult);
    }
}
// 請求包裝類(重寫getInputStream)
class HttpServletRequestWrapper extends HttpServletRequestWrapper {
    private final String body;
    public HttpServletRequestWrapper(HttpServletRequest request, String body) {
        super(request);
        this.body = body;
    }
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bis = new ByteArrayInputStream(body.getBytes());
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bis.read();
            }
            // 省略其他抽象方法實現
        };
    }
}

(2)配置過濾器生效

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<DataEncryptFilter> encryptFilterRegistration() {
        FilterRegistrationBean<DataEncryptFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new DataEncryptFilter());
        registration.addUrlPatterns("/api/v1/**"); // 配置需要加解密的接口路徑
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 保證過濾器優先執行
        return registration;
    }
}

3. 方案優勢

  • 全局統一:一次配置,所有接口自動加解密
  • 高性能:基于流處理,避免反射帶來的性能損耗
  • 適用場景:適合前后端分離項目的全局數據加密

五、實戰方案三:自定義 MessageConverter 實現透明加解密

1. 核心原理

重寫 Spring MVC 的 HttpMessageConverter,在請求參數解析和響應數據序列化階段自動完成加解密,與框架深度整合。

2. 實現步驟

(1)自定義加解密轉換器

public class EncryptingHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
    @Override
    protected boolean supports(Class<?> clazz) {
        return true; // 支持所有類型
    }
    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) 
            throws IOException, HttpMessageNotReadableException {
        // 讀取加密的請求體并解密
        String encrypted = IOUtils.toString(inputMessage.getBody(), StandardCharsets.UTF_8);
        String decrypted = AESUtils.decrypt(encrypted);
        return JSON.parseObject(decrypted, clazz);
    }
    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) 
            throws IOException, HttpMessageNotWritableException {
        // 將響應對象加密后寫出
        String plain = JSON.toJSONString(object);
        String encrypted = AESUtils.encrypt(plain);
        outputMessage.getBody().write(encrypted.getBytes(StandardCharsets.UTF_8));
    }
}

(2)注冊自定義轉換器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new EncryptingHttpMessageConverter());
        // 保留默認轉換器(可選)
        // converters.addAll(Collections.singletonList(new MappingJackson2HttpMessageConverter()));
    }
}

3. 方案優勢

  • 框架級整合:與 Spring MVC 數據綁定機制深度融合
  • 類型安全:自動處理對象與加密字符串的轉換
  • 適用場景:適合對請求 / 響應格式有嚴格控制的場景

六、三種方案對比與選型建議

方案一:AOP 注解

侵入性:低

性能:中靈

活性:接口級控制

適用場景:部分接口需要加解密

方案二:全局過濾器

侵入性:中性能:高

靈活性:路徑級控制

適用場景:前后端分離項目全局加密

方案三:MessageConverter

侵入性:高

性能:最高

靈活性:框架級控制

適用場景:統一請求響應格式場景

七、生產環境最佳實踐

1. 密鑰管理方案

  • 禁止硬編碼:通過 Spring Config 或配置中心(如 Nacos)管理密鑰
  • 密鑰輪換:定期生成新密鑰,舊密鑰逐步淘汰
  • 硬件安全:敏感系統使用 HSM(硬件安全模塊)存儲密鑰

2. 異常處理機制

@RestControllerAdvice
public class EncryptExceptionHandler {
    @ExceptionHandler(DecryptionException.class)
    public ResponseEntity<String> handleDecryptionError(DecryptionException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body("數據解密失敗:" + e.getMessage());
    }
}

3. 性能優化技巧

  • 壓縮后加密:對大體積數據先壓縮再加密(Gzip 壓縮可減少 50% 數據量)
  • 異步加解密:使用 CompletableFuture 實現加解密與業務邏輯并行處理
  • 緩存加密結果:對高頻訪問接口的加密結果進行緩存

八、總結

Spring Boot 提供了從接口級到框架級的完整加解密解決方案,核心是根據業務場景選擇合適的實現方式:

  • 追求靈活性選 AOP 注解
  • 追求統一性選 全局過濾器
  • 追求框架整合選 MessageConverter

無論哪種方案,都需注意密鑰安全和異常處理。通過本文的源碼示例,開發者可快速在項目中落地接口數據加解密功能,在保障數據安全的同時,最小化對現有業務的影響。

在數據安全日益重要的今天,掌握接口加解密技術,不僅是程序員的核心競爭力,更是保障系統安全的必備技能。選擇合適的方案,讓數據在網絡傳輸中穿上 “防彈衣”,這才是現代后端開發的正確姿勢。

責任編輯:武曉燕 來源: 小林聊編程
相關推薦

2022-07-27 08:49:34

接口加密解密

2024-09-27 15:24:15

Spring數據加解密

2022-12-14 09:06:58

接口Spring解密

2024-10-14 09:20:09

異步流式接口

2022-11-18 18:36:24

2011-06-03 11:53:06

Spring接口

2024-08-29 09:01:39

2025-03-03 13:08:36

2021-03-09 13:18:53

加密解密參數

2022-03-22 10:24:48

Linux開源Elasticsea

2022-06-04 12:25:10

解密加密過濾器

2009-11-06 13:23:27

WCF模式

2025-01-08 09:55:37

Spring接口數據庫

2017-07-03 18:24:39

MySQL數據冗余

2025-06-06 08:28:56

2011-07-22 17:22:20

Spring

2010-06-13 16:04:14

MySQL三種安裝方式

2012-07-17 09:16:16

SpringSSH

2023-11-22 15:22:34

SpringBootTomcat

2021-08-10 10:14:14

存儲接口存儲設備存儲
點贊
收藏

51CTO技術棧公眾號

色综合五月天| 欧美高清视频在线观看mv| 欧美午夜寂寞影院| 91视频在线观看| 自拍偷拍国产精品| 最近2018中文字幕免费在线视频| 国产日产亚洲精品系列| heyzo国产| 国产日韩一级二级三级| 一级黄色av| 欧美精品亚洲二区| 日韩国产一二三区| 国产成人精品视频在线| 精品久久美女| 精品综合在线| 久久精品欧美日韩| 欧美一区二区少妇| 日韩成人在线电影网| japanese色系久久精品| 国产乱人伦真实精品视频| 中文字幕一区二区三区在线视频 | 欧美在线观看网址综合| 国产精品x453.com| 青青草成人网| 91免费国产在线观看| 欧美知名女优| 日韩av在线网| 999久久久精品国产| 午夜一区二区三区| 中文字幕国产精品一区二区| 免费人成在线观看播放视频| 久久99久久亚洲国产| 秋霞电影一区二区| 在线看小视频| 色综久久综合桃花网| 日本视频在线观看| 精品国偷自产在线视频99| 久久精品日产第一区二区| 黄色片在线免费看| 国产欧亚日韩视频| 一区二区三区四区在线免费观看| www.成人影院| 一区二区视频在线播放| 亚洲精品一区二区三区四区高清 | 亚洲理论电影在线观看| 欧美日韩一二三| 亚洲视频狠狠| 亚洲裸体视频| 国产日韩精品在线观看| 亚洲永久免费av| 凹凸成人精品亚洲精品密奴| 黄网站免费观看| 国产成人精品久久亚洲高清不卡| 91久色porny| 欧美亚洲色图校园春色| 国产成人午夜电影| 国产精品99久久久久久白浆小说 | 成人免费无遮挡| 二级片在线观看| 国产丝袜一区二区三区免费视频| 久久亚洲不卡| 亚洲成人黄色| 能在线观看av网站| 国产日产久久高清欧美一区| 色拍拍在线精品视频8848| 99av国产精品欲麻豆| 国产三区视频在线观看| 大片在线观看网站免费收看| 久久影院在线观看| 亚洲国产精品久久人人爱蜜臀| 国内精品视频在线观看| 在线激情小视频| 四虎影院一区二区三区 | 国产91欧美| 欧美女同在线观看| 亚洲va国产va天堂va久久| 在线亚洲一区观看| 99麻豆久久久国产精品免费| 国产一区二区精品福利地址| yjizz视频网站在线播放| 亚洲欧洲一区二区| 最好看的2019年中文视频| 国产日韩欧美高清在线| 91精品一区二区三区综合| 日韩有码电影| 乱熟女高潮一区二区在线| 国产精品一区二区三区在线播放 | 国产精品欧美日韩久久| 欧美猛男gaygay网站| av成人免费在线观看| 亚洲黄网站黄| 久久资源综合| 色在线中文字幕| 国产在线视频资源| 亚洲男人天堂色| 亚洲第一页在线视频| 欧美一级淫片aaaaaaa视频| 国产午夜精品理论片a级探花| 久久久久久免费| 日韩亚洲国产精品| 伊人久久大香线蕉综合网站| av成人 com a| av在线免费一区| 婷婷综合影院| 欧美污视频网站| 国产美女作爱全过程免费视频| 欧美三日本三级少妇三99| 国产精品一区二区女厕厕| 欧美精品免费在线| 亚洲偷熟乱区亚洲香蕉av| 日韩西西人体444www| 日韩欧美精品网址| 五月天国产精品| 91黄色免费网站| 欧美老人xxxx18| 在线视频中文字幕一区二区| 一区二区三区日韩在线观看| 国产精品电影一区二区三区| 99热国产精品| 国产在线精品一区二区不卡了| 亚洲制服少妇| 影音先锋中文字幕一区| 99热免费精品| 久久99精品久久久| 国产精品一区二区在线看| 国产一区二区三区国产| 国产精品自产自拍| 中文字幕第一区二区| 中文字幕中文乱码欧美一区二区| 久久一区二区视频| 最新国产の精品合集bt伙计| 亚洲色图视频网| 在线观看日韩一区| 亚洲精品美女免费| 亚洲视频欧洲视频| 美女少妇精品视频| 国产精品美女主播| 国产欧美亚洲日本| 国产一区精品视频| 中文字幕欧美日韩一区二区三区| 日韩av黄色网址| 日韩亚洲视频在线观看| 日本中文字幕在线看| 天堂av中文在线观看| 一区二区三区亚洲变态调教大结局 | 亚洲色图欧美激情| 亚洲天堂av在线免费| 成人av蜜桃| 国产超碰精品在线观看| 日韩一区精品| 久久97超碰国产精品超碰| 色综合中文字幕国产| 91黑丝高跟在线| 国产深夜男女无套内射| 三级成人在线| 久久国产精品99久久人人澡| 欧美日韩免费观看一区三区| 国产精品一区久久久| 国产青青视频| 日韩成人精品一区二区| 亚洲成人午夜影院| 国产精品亚洲自拍| 三级做a全过程在线观看| the porn av| 99免费在线观看视频| 亚洲黄色片网站| 五月天一区二区三区| 精品国产区一区二区三区在线观看 | 欧美涩涩视频| 色哟哟欧美精品| 快播亚洲色图| 欧美日韩国产观看视频| 午夜久久久久| 久久狠狠亚洲综合| 亚洲自拍偷拍综合| 亚洲国产一区二区三区在线观看| 日韩免费精品视频| 亚洲成年人专区| 经典三级在线| 丝袜视频国产在线播放| 在线观看免费视频你懂的| 久久亚州av| 中文字幕人成人乱码| 国产一区二区福利视频| 一级女性全黄久久生活片免费| 亚洲欧美资源在线| 国产欧美日韩亚洲| 免费av播放| 91九色成人| 成人国产电影网| 337p日本欧洲亚洲大胆色噜噜| 国产在线a不卡| 中文字幕在线第一页| 国产精品一区二区三区美女| 丁香网亚洲国际| 日韩精品中文字幕在线观看| 亚洲最大福利网| 中文字幕免费在线观看| 日韩美脚连裤袜丝袜在线| 日本一区二区免费在线|