最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)接口加密的五大技巧分享

 更新時間:2025年07月11日 08:58:35   作者:墨瑾軒  
為了有效應對接口安全面臨的挑戰(zhàn),接口加密作為一種至關重要的手段,能夠將原始數(shù)據(jù)轉化為密文進行傳輸,從而確保數(shù)據(jù)在傳輸過程中的機密性和完整性,本文將深入探討SpringBoot接口加密的最佳實踐,需要的朋友可以參考下

5大神器,讓接口“秒變”加密大師

神器1:RSA+AES混合加密——加密界的“黃金CP”

目標:用RSA加密AES密鑰,用AES加密數(shù)據(jù),實現(xiàn)“速度與安全兼得”。

代碼示例(加密工具類)

import javax.crypto.Cipher;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  
import java.security.KeyFactory;  
import java.security.spec.X509EncodedKeySpec;  
import java.util.Base64;  

// ?? RSA工具類(服務端生成密鑰對)  
public class RSAUtil {  
    private static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding";  

    // ?? 生成RSA公鑰和私鑰(服務端執(zhí)行一次)  
    public static KeyPair generateRSAKeyPair() throws Exception {  
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");  
        generator.initialize(2048); // 推薦2048位以上  
        return generator.generateKeyPair();  
    }  

    // ?? 用RSA公鑰加密AES密鑰  
    public static byte[] encryptRSA(byte[] data, PublicKey publicKey) throws Exception {  
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);  
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
        return cipher.doFinal(data);  
    }  

    // ?? 用RSA私鑰解密AES密鑰  
    public static byte[] decryptRSA(byte[] encryptedData, PrivateKey privateKey) throws Exception {  
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);  
        cipher.init(Cipher.DECRYPT_MODE, privateKey);  
        return cipher.doFinal(encryptedData);  
    }  
}  

// ?? AES工具類(對稱加密)  
public class AESUtil {  
    private static final String AES_ALGORITHM = "AES/CBC/PKCS7Padding";  

    // ?? 生成AES密鑰和偏移量(客戶端隨機生成)  
    public static SecretKey generateAESKey() {  
        return new SecretKeySpec(KeyGenerator.getInstance("AES").generateKey().getEncoded(), "AES");  
    }  

    // ?? 生成AES偏移量(IV)  
    public static IvParameterSpec generateIV() {  
        byte[] iv = new byte[16]; // 16字節(jié)固定長度  
        new SecureRandom().nextBytes(iv);  
        return new IvParameterSpec(iv);  
    }  

    // ?? AES加密數(shù)據(jù)  
    public static byte[] encryptAES(byte[] data, SecretKey key, IvParameterSpec iv) throws Exception {  
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);  
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);  
        return cipher.doFinal(data);  
    }  

    // ?? AES解密數(shù)據(jù)  
    public static byte[] decryptAES(byte[] encryptedData, SecretKey key, IvParameterSpec iv) throws Exception {  
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);  
        cipher.init(Cipher.DECRYPT_MODE, key, iv);  
        return cipher.doFinal(encryptedData);  
    }  
}  

關鍵點

  • 對比純RSA
// 純RSA:加密慢,且無法加密超過密鑰長度的數(shù)據(jù)  
// 混合加密:RSA加密小數(shù)據(jù)(AES密鑰),AES加密大數(shù)據(jù)(請求參數(shù))  

神器2:自定義注解——給接口裝個“加密開關”

目標:用注解標記需要加密的接口,實現(xiàn)“按需加密”。

代碼示例(自定義注解)

import java.lang.annotation.*;  

// ?? 自定義@RequestRSA注解  
@Target({ElementType.TYPE, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface RequestRSA {  
    // 可擴展字段(如加密版本號)  
}  

神器3:AOP自動解密——讓解密“隱形”

目標:通過AOP攔截請求,自動解密參數(shù),無需手動處理。

代碼示例(AOP切面)

import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.springframework.stereotype.Component;  
import com.alibaba.fastjson.JSONObject;  

@Aspect  
@Component  
public class RSAAspect {  
    @Around("@annotation(RequestRSA)")  
    public Object decryptRequest(ProceedingJoinPoint joinPoint) throws Throwable {  
        // 1?? 獲取原始請求參數(shù)(JSON格式)  
        Object[] args = joinPoint.getArgs();  
        String rawBody = args[0].toString(); // 假設第一個參數(shù)是請求體  

        // 2?? 解析sym和asy參數(shù)  
        JSONObject bodyJson = JSONObject.parseObject(rawBody);  
        String sym = bodyJson.getString("sym"); // RSA加密的AES密鑰  
        String asy = bodyJson.getString("asy"); // AES加密的請求參數(shù)  

        // 3?? 解密AES密鑰(使用RSA私鑰)  
        byte[] encryptedAESKey = Base64.getDecoder().decode(sym);  
        byte[] decryptedAESKey = RSAUtil.decryptRSA(encryptedAESKey, getPrivateKey()); // 需實現(xiàn)私鑰獲取邏輯  

        // 4?? 解密請求參數(shù)(使用AES密鑰)  
        byte[] aesKey = new SecretKeySpec(decryptedAESKey, "AES"); // 轉換為SecretKey  
        byte[] decryptedData = AESUtil.decryptAES(  
            Base64.getDecoder().decode(asy),  
            aesKey,  
            generateIV() // 需從參數(shù)中提取IV(此處簡化)  
        );  

        // 5?? 將解密后的參數(shù)綁定到接口入?yún)ο? 
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
        Object target = joinPoint.getTarget();  
        Method method = signature.getMethod();  
        Object[] newArgs = new Object[]{JSONObject.parseObject(new String(decryptedData), method.getParameterTypes()[0])};  

        // 6?? 繼續(xù)執(zhí)行原方法  
        return joinPoint.proceed(newArgs);  
    }  

    // ?? 私鑰獲取(需替換為實際私鑰)  
    private PrivateKey getPrivateKey() {  
        // 從文件或內存中加載私鑰(此處簡化)  
        return null;  
    }  
}  

關鍵點

  • 自動解密流程
// 前端 → 發(fā)送 {sym: "RSA加密的AES密鑰", asy: "AES加密的參數(shù)"}  
// 后端 → 自動解密 → 參數(shù)自動綁定到接口入?yún)ο? 

神器4:異常處理——讓系統(tǒng)“防崩防炸”

目標:優(yōu)雅處理解密失敗場景,避免接口崩潰。

代碼示例(全局異常處理)

import org.springframework.web.bind.annotation.ExceptionHandler;  
import org.springframework.web.bind.annotation.RestControllerAdvice;  

@RestControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(Exception.class)  
    public ResponseEntity<String> handleException(Exception e) {  
        if (e.getMessage().contains("解密失敗")) {  
            return ResponseEntity.status(400).body("? 密鑰錯誤或請求過期!");  
        }  
        return ResponseEntity.status(500).body("內部錯誤!");  
    }  
}  

神器5:全流程演示——從生成密鑰到調用接口

目標:實戰(zhàn)演示如何生成密鑰、加密請求、解密響應。

代碼示例(全流程)

// ?? 服務端:生成RSA密鑰對  
KeyPair rsaKeyPair = RSAUtil.generateRSAKeyPair();  
PublicKey publicKey = rsaKeyPair.getPublic(); // 分發(fā)給客戶端  
PrivateKey privateKey = rsaKeyPair.getPrivate(); // 服務端保存  

// ?? 客戶端:加密請求  
// 1?? 生成AES密鑰和偏移量  
SecretKey aesKey = AESUtil.generateAESKey();  
IvParameterSpec iv = AESUtil.generateIV();  

// 2?? 加密真實參數(shù)(如JSON字符串)  
String originalParams = "{\"username\":\"張三\", \"age\":18}";  
byte[] encryptedParams = AESUtil.encryptAES(  
    originalParams.getBytes(),  
    aesKey,  
    iv  
);  

// 3?? 將AES密鑰和元數(shù)據(jù)用RSA加密  
JSONObject meta = new JSONObject();  
meta.put("key", Base64.getEncoder().encodeToString(aesKey.getEncoded()));  
meta.put("keyVI", Base64.getEncoder().encodeToString(iv.getIV()));  
meta.put("time", System.currentTimeMillis());  

byte[] encryptedMeta = RSAUtil.encryptRSA(  
    meta.toJSONString().getBytes(),  
    publicKey // 客戶端需提前獲取公鑰  
);  

// 4?? 發(fā)送請求  
RequestBody requestBody = new RequestBody() {  
    "sym": Base64.getEncoder().encodeToString(encryptedMeta),  
    "asy": Base64.getEncoder().encodeToString(encryptedParams)  
};  
// → 后端自動解密并返回結果  

你的接口,現(xiàn)在是“防破解超接口”了嗎?

通過這5大神器,我們實現(xiàn)了:

  1. RSA+AES混合加密:速度與安全兼得,破解者“一臉懵”。
  2. 自定義@RequestRSA注解:按需加密,代碼更優(yōu)雅。
  3. AOP自動解密:參數(shù)自動綁定,開發(fā)者“零感知”。
  4. 全局異常處理:解密失敗也能優(yōu)雅報錯。
  5. 全流程演示:從密鑰生成到接口調用,手把手教你落地。

到此這篇關于SpringBoot實現(xiàn)接口加密的五大技巧分享的文章就介紹到這了,更多相關SpringBoot接口加密技巧內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 細品Java8中hashCode方法的使用

    細品Java8中hashCode方法的使用

    這篇文章主要介紹了細品Java8中hashCode方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java測試框架Mockito的簡明教程

    Java測試框架Mockito的簡明教程

    這篇文章主要介紹了Java測試框架Mockito的簡明教程,Mock 測試是單元測試的重要方法之一。本文介紹了基于 Java 語言的 Mock 測試框架 – Mockito 的使用。,需要的朋友可以參考下
    2019-06-06
  • Java基于JNDI 實現(xiàn)讀寫分離的示例代碼

    Java基于JNDI 實現(xiàn)讀寫分離的示例代碼

    本文主要介紹了Java基于JNDI 實現(xiàn)讀寫分離的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java HashMap實現(xiàn)原理分析(一)

    Java HashMap實現(xiàn)原理分析(一)

    這篇文章主要介紹了Java HashMap實現(xiàn)原理的分析,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-08-08
  • FeignClient如何脫離eureka自定義URL

    FeignClient如何脫離eureka自定義URL

    這篇文章主要介紹了FeignClient如何脫離eureka自定義URL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java設計模式常用的七大原則總結

    Java設計模式常用的七大原則總結

    今天給大家總結了Java設計模式的七大原則,主要有單一職責原則,接口隔離原則,依賴倒轉原則,里氏替換原則等,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • Jmeter命令行執(zhí)行腳本如何設置動態(tài)參數(shù)

    Jmeter命令行執(zhí)行腳本如何設置動態(tài)參數(shù)

    這篇文章主要介紹了Jmeter命令行執(zhí)行腳本如何設置動態(tài)參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • redis分布式鎖的原理及代碼實例

    redis分布式鎖的原理及代碼實例

    這篇文章主要介紹了redis分布式鎖的原理及代碼實例,Redis作為一款高性能內存數(shù)據(jù)庫,其提供了一種非常實用的分布式鎖解決方案,可以幫助開發(fā)人員輕松地實現(xiàn)分布式鎖功能,對于分布式系統(tǒng)的開發(fā)和維護,具有非常大的實用價值,需要的朋友可以參考下
    2024-01-01
  • Java的Function接口與andThen組合及解讀

    Java的Function接口與andThen組合及解讀

    文章介紹了Java 8中的Function接口及其andThen方法,詳細解釋了Function接口的基礎概念、用法、組合機制及應用,包括與compose方法的對比、在Stream API中的使用場景、高級應用場景和最佳實踐,并強調了保持代碼簡潔、可讀性和靈活性的重要性
    2026-04-04

最新評論

汕尾市| 苗栗县| 刚察县| 华亭县| 霍林郭勒市| 五河县| 岑溪市| 开阳县| 疏勒县| 金华市| 四子王旗| 新田县| 社旗县| 白水县| 中西区| 合作市| 板桥市| 邳州市| 柞水县| 仁怀市| 阳春市| 禄丰县| 武陟县| 大庆市| 察哈| 德格县| 蒙城县| 台湾省| 嘉禾县| 长丰县| 吉木乃县| 错那县| 墨江| 巩义市| 留坝县| 平阳县| 西青区| 莱芜市| 南昌市| 广元市| 卢氏县|