Spring Boot 一個注解搞定「加密 + 解密 + 簽名 + 驗簽」

Spring Boot 一個注解搞定「加密 + 解密 + 簽名 + 驗簽」

本文基于 Spring Boot 3.x,通過一個自定義注解 + AOP,一行注解即可給任何 Controller 方法加上
請求解密 → 驗簽 → 響應加密 → 加簽 的完整鏈路,并可直接拷貝到生產環境使用。

一、最終效果

@PostMapping("/order")
@ApiSecurity(decryptRequest = true, encryptResponse = true)   // ← 就這么一行
public OrderResp createOrder(@RequestBody OrderReq req) {return service.create(req);
}
  • 請求體:RSA 加密后的 AES 密鑰 + AES 加密后的業務 JSON + 簽名
  • 框架自動完成 解密 → 驗簽 → 業務處理 → 響應加密 → 加簽
  • 零侵入,老接口想加安全,貼一個注解即可。

二、傳輸對象

@Data
public class ApiSecurityParam {private String appId;      // 應用標識private String key;        // RSA 加密后的 AES 密鑰(Base64)private String data;       // AES 加密的業務 JSON(Base64)private String sign;       // 簽名private String timestamp;  // 防重放private String nonce;      // 防重放
}

三、核心注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiSecurity {boolean decryptRequest()  default false; // 請求體是否解密boolean encryptResponse() default false; // 響應體是否加密boolean sign()            default true;  // 是否驗簽/加簽
}

四、AOP 切面(RequestBodyAdvice + ResponseBodyAdvice)

同時解決 InputStream 只能讀一次 的問題。

4.1 解密 & 驗簽 RequestBodyAdvice

@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class DecryptRequestAdvice implements RequestBodyAdvice {@Overridepublic boolean supports(MethodParameter methodParameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) {return methodParameter.hasMethodAnnotation(ApiSecurity.class)&& methodParameter.getMethodAnnotation(ApiSecurity.class).decryptRequest();}@Overridepublic Object handleEmptyBody(Object body, HttpInputMessage inputMessage,MethodParameter parameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) {return body;}@SneakyThrows@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage,MethodParameter parameter, Type targetType,Class<? extends HttpMessageConverter<?>> converterType) {String body = StreamUtils.copyToString(inputMessage.getBody(), StandardCharsets.UTF_8);ApiSecurityParam param = JSON.parseObject(body, ApiSecurityParam.class);// 1. 防重放校驗(timestamp、nonce)checkReplay(param);// 2. RSA 私鑰解密 AES 密鑰String aesKey = RSAUtil.decryptByPrivateKey(param.getKey(), RsaKeyHolder.PRIVATE_KEY);// 3. AES 解密業務 JSONString json = AESUtil.decrypt(param.getData(), aesKey);// 4. 驗簽boolean ok = RSAUtil.verify(json + param.getTimestamp() + param.getNonce(),RsaKeyHolder.PUBLIC_KEY, param.getSign());if (!ok) throw new BizException("驗簽失敗");return new MappingJacksonInputMessage(new ByteArrayInputStream(json.getBytes()),inputMessage.getHeaders());}
}

4.2 加密 & 加簽 ResponseBodyAdvice

@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class EncryptResponseAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {ApiSecurity anno = returnType.getMethodAnnotation(ApiSecurity.class);return anno != null && anno.encryptResponse();}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {String json = JSON.toJSONString(body);// 1. 隨機 AES 密鑰String aesKey = AESUtil.randomKey(128);// 2. AES 加密響應String data = AESUtil.encrypt(json, aesKey);// 3. RSA 公鑰加密 AES 密鑰String encKey = RSAUtil.encryptByPublicKey(aesKey, RsaKeyHolder.PUBLIC_KEY);// 4. 生成簽名String sign = RSAUtil.sign(json, RsaKeyHolder.PRIVATE_KEY);ApiSecurityParam resp = new ApiSecurityParam();resp.setKey(encKey);resp.setData(data);resp.setSign(sign);resp.setTimestamp(String.valueOf(System.currentTimeMillis()));return resp;}
}

五、工具類速覽

  • RSAUtilencrypt/decrypt + sign/verify
  • AESUtilencrypt/decrypt 支持 PKCS5Padding
  • RsaKeyHolder:從 application.yml 或 KMS 讀取公私鑰

六、性能 & 安全小貼士

建議
對稱加密AES-128-CBC/PKCS5Padding
非對稱RSA-2048
防重放timestamp ±5 min + nonce 一次性
密鑰輪換每日定時任務刷新 RSA 密鑰對
性能AES 每次隨機 IV,RSA 只加密 128bit 密鑰,無壓力

七、小結

通過以上 一個注解 + 兩個 Advice,在 Spring Boot 中實現 企業級安全傳輸

  • 0 侵入:老接口貼注解即可
  • 高可擴展:支持 GET/POST、Header 傳參、自定義算法
  • 已落地:可直接封裝為 spring-boot-starter-security-api,全公司復用。

源碼示例已上傳 GitHub:
https://github.com/your-org/spring-boot-api-security-starter

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《計算機網絡》實驗報告二 IP協議分析

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 tcpdump 基本用法 3.2 wireshark基本用法 3.3 利用tcpdump抓包&#xff0c;wireshark分析包 4、實驗結果與分析 4.1 tcpdump命令的基本用法 4.2 wireshark的基本用法 4.3 利用tcpdump抓包&#xff0c;wireshark分析包…

k8s學習記錄(三):Pod基礎-Node選擇

一、前言 在上一篇文章中我們學習了Pod的一些基本的知識&#xff0c;今天我們將繼續學習Pod。 二、K8S如何選擇節點來運行Pod 我們知道在一個K8S集群中&#xff0c;會有多個工作節點&#xff08;Worker Node&#xff09;&#xff0c;那么k8s會選擇那個node呢&#xff1f;接下…

3天功能開發→3小時:通義靈碼2.0+DEEPSEEK實測報告,單元測試生成準確率92%的秘密

活動鏈接&#xff1a;https://developer.aliyun.com/topic/lingma-aideveloper?spma2c6h.29979852.J_9593490300.2.49b8110eeymlF8 前言 隨著人工智能技術的迅猛發展&#xff0c;AI 賦能編程成為了必然趨勢。通義靈碼應運而生&#xff0c;它是阿里巴巴集團在人工智能與編程領…

【小沐學GIS】基于Rust繪制三維數字地球Earth(Rust、OpenGL、GIS)

&#x1f37a;三維數字地球GIS系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐學GI…

ARM 學習筆記(三)

參考文獻&#xff1a;《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》《ARM Cortex-A (ARMv7-A) Series Programmer’s Guide》1、內存類型 ARMv7-A 處理器中&#xff0c;將 Memory 定義為幾種類型&#xff08;Memory Type&#xff09;&#xff1a; Strong…

Flask 框架(一):核心特性與基礎配置

目錄 一、為什么選擇 Flask&#xff1f; 二、Flask 核心概念與初始化 2.1 程序實例初始化 2.2 運行配置&#xff1a;app.run () 參數詳解 2.3 應用配置&#xff1a;三種參數設置方式 1. 字典直接配置&#xff08;簡單臨時場景&#xff09; 2. 配置文件導入&#xff08;生…

社交圈子系統開源社交源碼 / 小程序+H5+APP 多端互通的底層技術分析

伴隨社交產品向“圈子化”、“內容驅動”發展方向演進&#xff0c;打造一套支持小程序、H5、APP 互通的社交圈子系統&#xff0c;已經成為構建垂直社區的基礎架構能力要求。本文圍繞一套典型的多端社交興趣平臺&#xff08;即友貓社區平臺&#xff09;的設計實踐&#xff0c;對…

gitlab-runner配置問題記錄

引言 筆者曾通過2種方式部署過 gitlab-runner&#xff0c;在 gitlab 中使用這個 runner 拉起 ci job 的過程中或多或少遇到些問題&#xff0c;主要都是 job 中無法訪問宿主機的docker 等組件。本篇文檔主要記錄 gitlab-runner 安裝及相關配置。 二進制部署 gitlab-runner 部署 …

每日面試題10:令牌桶

令牌桶算法&#xff1a;優雅的流量控制藝術在現代分布式系統中&#xff0c;流量控制如同交通信號燈般重要——它既不能讓請求"堵死"系統&#xff0c;也不能放任流量"橫沖直撞"。令牌桶算法&#xff08;Token Bucket Algorithm&#xff09;正是這樣一種精妙…

【java】消息推送

文章目錄Java網頁消息推送解決方案 短輪詢、長輪詢、SSE、Websocket

STM32 | 有源蜂鳴器響,無源蜂鳴器播音樂

目錄 Overview 有源蜂鳴器 無源蜂鳴器 有源蜂鳴器控制 GPIO配置 控制程序 無源蜂鳴器控制 反轉GPIO控制 GPIO配置 控制接口 PWM控制 GPIO配置 控制函數 改變頻率播音樂 原理 1. 頻率決定音調 2. 占空比決定音量 GPIO初始化 結構體定義和音符頻率表 播放接口 …

第十四章 gin基礎

文章目錄Gin快速搭建一個web服務Gin數據交互JSON串內容規范Gin使用結構體返回數據給前端Gin配置POST類型的路由Gin獲取GET請求參數Gin獲取POST請求參數-form-data類型Gin獲取POST請求參數-JSON類型Gin獲取參數綁定至結構體Gin快速搭建一個web服務 下載包 \\新建一個文件&…

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8的深度學習模型實現PCB的缺陷檢測&#xff08;C#代碼&#xff0c;UI界面版&#xff09;工業相機使用YoloV8模型實現PCB的缺陷檢測工業相機實現YoloV8模型實現PCB的缺陷檢測的技術背景在相機SDK中獲取圖像轉換圖像的代碼分析工業相機圖…

【Vivado那些事兒】AMD-XILINX 7系列比特流加密

前提&#xff1a;加密有風險&#xff0c;操作需謹慎前言在許多項目中&#xff0c;經過漫長的等待&#xff0c;我們的 FPGA 設計終于可以投入現場部署了。前期的資金的投入及知識產權的保護&#xff0c;我們需要對現場部署的 FPGA 進行比特流保護以防止逆向工程和未經授權的重復…

RK3588 安卓adb操作

adb&#xff08;Android Debug Bridge&#xff09;是一個用于與安卓設備進行通信和控制的工具。adb可以通過USB或無線網絡連接安卓設備&#xff0c;執行各種命令&#xff0c;如安裝和卸載應用&#xff0c;傳輸文件&#xff0c;查看日志&#xff0c;運行shell命令等。adb是安卓開…

【華為機試】70. 爬樓梯

文章目錄70. 爬樓梯描述示例 1示例 2提示解題思路核心分析問題建模算法實現方法1&#xff1a;動態規劃&#xff08;標準解法&#xff09;方法2&#xff1a;空間優化動態規劃&#xff08;最優解&#xff09;方法3&#xff1a;遞歸 記憶化方法4&#xff1a;數學公式&#xff08;…

山東大學軟件學院面向對象期末復習

面向對象 文章目錄面向對象04 類封裝接口 抽象類05 消息&#xff0c;實例化&#xff0c;靜態變量方法消息動/靜態類型語言對象創建類及實例具有下面特征對象數組的創建靜態數據成員構造函數06_0 繼承繼承是向下傳遞的JAVA為什么不支持多重繼承繼承的形式特殊化繼承替換原則規范…

讓 Windows 用上 macOS 的系統下載與保姆級使用教程

模擬蘋果桌面軟件下載&#xff1a;https://xpan.com.cn/s/8NFAGT 還記得 Windows 11剛發布時&#xff0c;很多人就說“果里果氣"的&#xff0c;但界面確實做的漂亮。 不知道現在有多少小伙伴正用著macOS&#xff0c;不過我敢確定&#xff0c;喜歡macOS的人絕對不少&#…

嵌入式硬件篇---繼電器

繼電器是一種通過小電流控制大電流的電磁開關&#xff0c;廣泛應用于自動化控制、電力系統和電子設備中。以下從工作原理、應用場景和電路特點三個方面詳細介紹&#xff1a;一、工作原理繼電器本質是電磁控制的機械式開關&#xff0c;核心部件包括&#xff1a;線圈&#xff08;…

鴻蒙網絡編程系列58-倉頡版TLS數字證書查看及驗簽示例

1. TLS數字證書驗簽簡介 數字證書的簽名驗證是網絡編程中一個重要的功能&#xff0c;它保證了數字證書是由可信任的簽發方簽署的&#xff0c;在此基礎上&#xff0c;我們才可以信任該證書&#xff0c;進而信任基于該證書建立的安全通道&#xff0c;所以說&#xff0c;數字證書…