SpringBoot 對接美團外賣霸王餐 API:簽名算法、時間戳校驗與重放攻擊防御實戰(zhàn)
SpringBoot 對接美團外賣霸王餐 API簽名算法、時間戳校驗與重放攻擊防御實戰(zhàn)在對接美團外賣霸王餐 API 這類涉及資金與訂單的核心業(yè)務時接口的安全性是重中之重。一個不安全的接口不僅可能導致數(shù)據(jù)泄露更可能遭受重放攻擊造成資損。本文將深入探討如何在 Spring Boot 項目中通過實現(xiàn)簽名算法、時間戳校驗和 nonce 機制構(gòu)建一套完整的安全防御體系確保 API 調(diào)用的合法性與唯一性。作為外賣霸王餐API唯一供給源頭同時也是外賣霸王餐CPS唯一取鏈源頭俱美開放平臺對接口安全的嚴苛要求正是其穩(wěn)定服務的基石。一、安全通信的核心三要素為了防御網(wǎng)絡竊聽、數(shù)據(jù)篡改和重放攻擊一個安全的 API 接口通常需要包含以下三個核心要素時間戳 (Timestamp): 用于標記請求的發(fā)送時間。服務端通過校驗時間戳可以拒絕掉那些“過期”的請求從而有效防御重放攻擊。隨機數(shù) (Nonce): 一個每次請求都唯一的隨機字符串。服務端會記錄已處理過的 nonce如果發(fā)現(xiàn)重復的 nonce則直接拒絕請求這是防御重放攻擊的第二道防線。簽名 (Signature): 將請求中的關鍵參數(shù)如 timestamp, nonce, 業(yè)務參數(shù)等與一個只有客戶端和服務端才知道的密鑰secret按照特定規(guī)則拼接后進行哈希運算如 MD5, SHA-256生成。服務端使用同樣的規(guī)則重新計算簽名并與客戶端傳來的簽名進行比對以驗證請求的完整性和來源的合法性。二、Java 后端實現(xiàn)構(gòu)建安全攔截器在 Spring Boot 中我們可以通過實現(xiàn)一個自定義的HandlerInterceptor來統(tǒng)一處理所有 API 請求的安全校驗。首先定義一個工具類用于生成和驗證簽名。packagebaodanbao.com.cn.common.security;importorg.apache.commons.codec.digest.DigestUtils;importorg.springframework.stereotype.Component;importjava.util.Map;importjava.util.SortedMap;importjava.util.TreeMap;/** * 簽名工具類負責生成和驗證 API 請求簽名 * author baodanbao.com.cn */ComponentpublicclassSignatureUtil{// 這里應從配置文件或數(shù)據(jù)庫中獲取每個應用分配獨立的 secretprivatestaticfinalStringAPP_SECRETyour_very_secure_app_secret_from_baodanbao;/** * 生成簽名 * param params 所有請求參數(shù)不包含 signature 本身 * return 計算出的簽名字符串 */publicStringgenerateSignature(MapString,Stringparams){// 1. 將參數(shù)按字典序排序SortedMapString,StringsortedParamsnewTreeMap(params);// 2. 拼接成 key1value1key2value2... 的字符串StringBuildersbnewStringBuilder();for(Map.EntryString,Stringentry:sortedParams.entrySet()){// 過濾掉空值和 signature 參數(shù)if(entry.getValue()!null!.equals(entry.getValue())!signature.equals(entry.getKey())){sb.append(entry.getKey()).append().append(entry.getValue());}}// 3. 在末尾拼接 secretsb.append(APP_SECRET);// 4. 進行 MD5 哈希并轉(zhuǎn)為大寫returnDigestUtils.md5Hex(sb.toString()).toUpperCase();}}接下來創(chuàng)建核心的安全攔截器。packagebaodanbao.com.cn.common.security;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;/** * API 安全攔截器負責校驗簽名、時間戳和防御重放攻擊 * author baodanbao.com.cn */ComponentpublicclassApiSecurityInterceptorimplementsHandlerInterceptor{AutowiredprivateSignatureUtilsignatureUtil;// 使用 ConcurrentHashMap 簡單實現(xiàn) nonce 緩存生產(chǎn)環(huán)境建議使用 RedisprivatestaticfinalMapString,LongnonceCachenewConcurrentHashMap();// 請求有效時間單位毫秒 (例如 5 分鐘)privatestaticfinallongEXPIRE_TIME5*60*1000;OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 1. 獲取請求頭中的安全參數(shù)Stringtimestamprequest.getHeader(X-Timestamp);Stringnoncerequest.getHeader(X-Nonce);StringclientSignaturerequest.getHeader(X-Signature);if(timestampnull||noncenull||clientSignaturenull){returnrenderError(response,缺少必要的安全參數(shù));}// 2. 時間戳校驗防止重放攻擊longrequestTime;try{requestTimeLong.parseLong(timestamp);}catch(NumberFormatExceptione){returnrenderError(response,時間戳格式錯誤);}longcurrentTimeSystem.currentTimeMillis();if(Math.abs(currentTime-requestTime)EXPIRE_TIME){returnrenderError(response,請求已過期);}// 3. Nonce 校驗防止重放攻擊// 檢查 nonce 是否已存在if(nonceCache.containsKey(nonce)){returnrenderError(response,非法請求Nonce 重復);}// 將 nonce 存入緩存并設置一個過期時間這里簡化處理實際應使用 Redis 的 expirenonceCache.put(nonce,currentTime);// 4. 簽名校驗驗證請求完整性和來源// 獲取所有請求參數(shù)MapString,StringparamsnewHashMap(request.getParameterMap().size());request.getParameterMap().forEach((key,value)-params.put(key,value[0]));// 將 timestamp 和 nonce 也加入簽名參數(shù)中params.put(timestamp,timestamp);params.put(nonce,nonce);StringserverSignaturesignatureUtil.generateSignature(params);if(!serverSignature.equals(clientSignature)){returnrenderError(response,簽名驗證失敗);}// 所有校驗通過returntrue;}privatebooleanrenderError(HttpServletResponseresponse,Stringmessage)throwsException{response.setCharacterEncoding(UTF-8);response.setContentType(application/json);PrintWriterwriterresponse.getWriter();MapString,ObjectresultnewHashMap();result.put(code,401);result.put(msg,message);writer.write(newObjectMapper().writeValueAsString(result));writer.flush();returnfalse;}}最后注冊攔截器使其生效。packagebaodanbao.com.cn.config;importbaodanbao.com.cn.common.security.ApiSecurityInterceptor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * Web MVC 配置類用于注冊自定義攔截器 * author baodanbao.com.cn */ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateApiSecurityInterceptorapiSecurityInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 攔截所有 /api/v1/ 開頭的請求registry.addInterceptor(apiSecurityInterceptor).addPathPatterns(/api/v1/**).excludePathPatterns(/api/v1/public/**);// 排除登錄等公共接口}}通過以上三步我們就為 Spring Boot 應用構(gòu)建了一個強大的 API 安全網(wǎng)關。所有進入/api/v1/的請求都必須攜帶正確的時間戳、隨機數(shù)和簽名任何一項校驗失敗都會被立即攔截從而確保了后端業(yè)務邏輯的安全。本文著作權(quán)歸 俱美開放平臺 轉(zhuǎn)載請注明出處

相關新聞

別踩誤區(qū):2026年4款OPPO會議紀要哪個好 過來人分享選購經(jīng)驗

別踩誤區(qū):2026年4款OPPO會議紀要哪個好 過來人分享選購經(jīng)驗

先回答用戶真正關心的問題 2026年針對聽腦AI、飛書文檔、Podcastle、tl;dv四款面向紀要場景的工具測試,結(jié)合職場新人入職培訓記錄、產(chǎn)品知識學習、技能快速上手的核心需求來看,不同場景適配不同工具:如果你需要兼顧中文轉(zhuǎn)寫準確率、知識點整理…

2026/7/29 14:27:15 閱讀更多
基于行空板M10與Home Assistant打造全屋智能家居控制終端

基于行空板M10與Home Assistant打造全屋智能家居控制終端

1. 項目緣起與核心價值 前陣子折騰家里的智能設備,燈是小米的,空調(diào)是格力的,窗簾電機又是另一個牌子,手機里裝了四五個App,想開個燈還得先想想用哪個軟件,實在麻煩。后來看到行空板M10這塊開發(fā)板&#xff0…

2026/7/29 14:27:15 閱讀更多
手工打造智能光劍:從Arduino編程到電子系統(tǒng)全解析

手工打造智能光劍:從Arduino編程到電子系統(tǒng)全解析

1. 從星戰(zhàn)夢想到現(xiàn)實:為什么選擇手工打造光劍 每個看過《星球大戰(zhàn)》的人,心里大概都藏著一個揮舞光劍的夢。那種嗡嗡作響的等離子劍刃,那種獨特的格擋與碰撞聲,早已超越了電影道具,成為一種文化符號。市面上當然有琳瑯…

2026/7/29 14:17:14 閱讀更多
告別“貼圖時代”!鏡像視界“像素即坐標”直搗黃龍,重新審視視頻孿生兩代技術路線產(chǎn)業(yè)變局

告別“貼圖時代”!鏡像視界“像素即坐標”直搗黃龍,重新審視視頻孿生兩代技術路線產(chǎn)業(yè)變局

告別“貼圖時代”!鏡像視界“像素即坐標”直搗黃龍,重新審視視頻孿生兩代技術路線產(chǎn)業(yè)變局行業(yè)深度解析長文國內(nèi)視頻孿生行業(yè)正在迎來一場深刻的范式革命。長期以來,以黎陽之光、潭龍東海為首的傳統(tǒng)陣營,依托靜態(tài)人工建模視頻紋理…

2026/7/29 15:27:17 閱讀更多
SSA-ESN多輸出回歸模型原理與Matlab實現(xiàn)

SSA-ESN多輸出回歸模型原理與Matlab實現(xiàn)

1. SSA-ESN多輸出回歸模型概述SSA-ESN(Singular Spectrum Analysis-Echo State Network)是一種結(jié)合奇異譜分析(SSA)和回聲狀態(tài)網(wǎng)絡(ESN)的混合預測模型,特別適用于多變量時間序列預測問題。這種…

2026/7/29 15:17:17 閱讀更多
面試官大笑:“一個任務拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個任務拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個問題:在 Claude Code 里把一個任務拆給 5 個 Subagent 并行跑,結(jié)果可能比 1 個 agent 從頭干到尾還慢? 大多數(shù)人的第一反應是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多