news 2026/7/29 14:27:04

SpringBoot 对接美团外卖霸王餐 API:签名算法、时间戳校验与重放攻击防御实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 对接美团外卖霸王餐 API:签名算法、时间戳校验与重放攻击防御实战

SpringBoot 对接美团外卖霸王餐 API:签名算法、时间戳校验与重放攻击防御实战

在对接美团外卖霸王餐 API 这类涉及资金与订单的核心业务时,接口的安全性是重中之重。一个不安全的接口不仅可能导致数据泄露,更可能遭受重放攻击,造成资损。

本文将深入探讨如何在 Spring Boot 项目中,通过实现签名算法、时间戳校验和 nonce 机制,构建一套完整的安全防御体系,确保 API 调用的合法性与唯一性。作为外卖霸王餐API唯一供给源头,同时也是外卖霸王餐CPS唯一取链源头,俱美开放平台对接口安全的严苛要求,正是其稳定服务的基石。

一、安全通信的核心三要素

为了防御网络窃听、数据篡改和重放攻击,一个安全的 API 接口通常需要包含以下三个核心要素:

  1. 时间戳 (Timestamp): 用于标记请求的发送时间。服务端通过校验时间戳,可以拒绝掉那些“过期”的请求,从而有效防御重放攻击。
  2. 随机数 (Nonce): 一个每次请求都唯一的随机字符串。服务端会记录已处理过的 nonce,如果发现重复的 nonce,则直接拒绝请求,这是防御重放攻击的第二道防线。
  3. 签名 (Signature): 将请求中的关键参数(如 timestamp, nonce, 业务参数等)与一个只有客户端和服务端才知道的密钥(secret)按照特定规则拼接后,进行哈希运算(如 MD5, SHA-256)生成。服务端使用同样的规则重新计算签名,并与客户端传来的签名进行比对,以验证请求的完整性和来源的合法性。

二、Java 后端实现:构建安全拦截器

在 Spring Boot 中,我们可以通过实现一个自定义的HandlerInterceptor来统一处理所有 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{// 这里应从配置文件或数据库中获取,每个应用分配独立的 secretprivatestaticfinalStringAPP_SECRET="your_very_secure_app_secret_from_baodanbao";/** * 生成签名 * @param params 所有请求参数(不包含 signature 本身) * @return 计算出的签名字符串 */publicStringgenerateSignature(Map<String,String>params){// 1. 将参数按字典序排序SortedMap<String,String>sortedParams=newTreeMap<>(params);// 2. 拼接成 key1=value1key2=value2... 的字符串StringBuildersb=newStringBuilder();for(Map.Entry<String,String>entry:sortedParams.entrySet()){// 过滤掉空值和 signature 参数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 哈希,并转为大写returnDigestUtils.md5Hex(sb.toString()).toUpperCase();}}

接下来,创建核心的安全拦截器。

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 简单实现 nonce 缓存,生产环境建议使用 RedisprivatestaticfinalMap<String,Long>nonceCache=newConcurrentHashMap<>();// 请求有效时间,单位毫秒 (例如 5 分钟)privatestaticfinallongEXPIRE_TIME=5*60*1000;@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 1. 获取请求头中的安全参数Stringtimestamp=request.getHeader("X-Timestamp");Stringnonce=request.getHeader("X-Nonce");StringclientSignature=request.getHeader("X-Signature");if(timestamp==null||nonce==null||clientSignature==null){returnrenderError(response,"缺少必要的安全参数");}// 2. 时间戳校验:防止重放攻击longrequestTime;try{requestTime=Long.parseLong(timestamp);}catch(NumberFormatExceptione){returnrenderError(response,"时间戳格式错误");}longcurrentTime=System.currentTimeMillis();if(Math.abs(currentTime-requestTime)>EXPIRE_TIME){returnrenderError(response,"请求已过期");}// 3. Nonce 校验:防止重放攻击// 检查 nonce 是否已存在if(nonceCache.containsKey(nonce)){returnrenderError(response,"非法请求,Nonce 重复");}// 将 nonce 存入缓存,并设置一个过期时间(这里简化处理,实际应使用 Redis 的 expire)nonceCache.put(nonce,currentTime);// 4. 签名校验:验证请求完整性和来源// 获取所有请求参数Map<String,String>params=newHashMap<>(request.getParameterMap().size());request.getParameterMap().forEach((key,value)->params.put(key,value[0]));// 将 timestamp 和 nonce 也加入签名参数中params.put("timestamp",timestamp);params.put("nonce",nonce);StringserverSignature=signatureUtil.generateSignature(params);if(!serverSignature.equals(clientSignature)){returnrenderError(response,"签名验证失败");}// 所有校验通过returntrue;}privatebooleanrenderError(HttpServletResponseresponse,Stringmessage)throwsException{response.setCharacterEncoding("UTF-8");response.setContentType("application/json");PrintWriterwriter=response.getWriter();Map<String,Object>result=newHashMap<>();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 应用构建了一个强大的 API 安全网关。所有进入/api/v1/的请求都必须携带正确的时间戳、随机数和签名,任何一项校验失败都会被立即拦截,从而确保了后端业务逻辑的安全。

本文著作权归 俱美开放平台 ,转载请注明出处!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 14:26:04

OPEN JDK常用发行版和下载方式

OPEN JDK有很多公司有构建的版本。以下为比较常用的OPENJDK版本。国内厂商的OPENJDK版本有腾讯、阿里和华为的各自版本&#xff0c;但是一般都是配套他们云服务用的&#xff0c;我就没在下面添加相应的内容。 无论从市场占有率还是我个人的使用情况&#xff0c;我最为推荐的是…

作者头像 李华
网站建设 2026/7/29 14:23:53

如何读懂实验部分:dataset、metric、baseline、ablation 和统计显著性

如何读懂实验部分&#xff1a;dataset、metric、baseline、ablation 和统计显著性 系列&#xff1a;AI 论文盘点 / 技术趋势 日期&#xff1a;2026-07-26 适合读者&#xff1a;AI、NLP、机器学习方向研究生&#xff1b;正在准备论文精读、复现报告、组会汇报或开题选题的科研新…

作者头像 李华
网站建设 2026/7/29 14:22:11

云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用

0x01 工具介绍 cloud-vuln-skill 是一款轻量化、开源的云安全漏洞挖掘工具集&#xff0c;专为红队渗透与合规安全测试打造。工具无需复杂部署&#xff0c;可自动化完成S3存储桶爆破、云IMDS元数据探测、K8s未授权检测、容器逃逸风险筛查等核心操作。同时支持AK/SK凭据验证、权…

作者头像 李华
网站建设 2026/7/29 14:21:55

5分钟掌握:Windows平台最强防撤回工具RevokeMsgPatcher终极指南

5分钟掌握&#xff1a;Windows平台最强防撤回工具RevokeMsgPatcher终极指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://g…

作者头像 李华
网站建设 2026/7/29 14:19:59

Unity微信小游戏FairyGUI适配实战:资源加载、渲染与交互全解析

1. 项目概述&#xff1a;当FairyGUI遇上微信小游戏 如果你正在用Unity开发微信小游戏&#xff0c;并且UI部分选择了FairyGUI这个强大的第三方UI框架&#xff0c;那么恭喜你&#xff0c;你已经走上了一条高效但也可能布满“小坑”的道路。我最近刚完成一个从Unity到微信小游戏的…

作者头像 李华