当前位置: 首页 > news >正文

怎么做淘宝客个人网站网站程序模板

怎么做淘宝客个人网站,网站程序模板,招远网站设计,苏州建设工程合同备案网站简介 例如说:项目给第三方提供 HTTP 接口时,为了提高对接中数据传输的安全性(防止请求参数被篡改),同时校验调用方的有效性,通常都需要增加签名 sign。 市面上也有非常多的案例,例如说: 支付宝签名企业微信签名实现原理基本类似不再过多赘述,下面直接上代码。 1. 概述…

简介

例如说:项目给第三方提供 HTTP 接口时,为了提高对接中数据传输的安全性(防止请求参数被篡改),同时校验调用方的有效性,通常都需要增加签名 sign

市面上也有非常多的案例,例如说:

  • 支付宝签名
  • 企业微信签名

实现原理基本类似不再过多赘述,下面直接上代码。

1. 概述

API签名校验机制是一个用于保护API接口安全性的框架,通过验证请求的完整性和时效性,防止请求被篡改和重放攻击。该机制基于Spring AOP实现,使用注解方式配置,支持自动配置。

2. 核心组件

2.1 注解组件 (ApiSignature.java)

@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiSignature {// 签名有效时间,默认60秒int timeout() default 60;// 时间单位,默认秒TimeUnit timeUnit() default TimeUnit.SECONDS;// 签名失败时的错误提示String message() default "签名不正确";// 签名参数配置String appId() default "appId";String timestamp() default "timestamp";String nonce() default "nonce";String sign() default "sign";
}

2.2 切面组件 (ApiSignatureAspect.java)

@Aspect
@Slf4j
@AllArgsConstructor
public class ApiSignatureAspect {private final ApiSignatureRedisDAO signatureRedisDAO;@Before("@annotation(signature)")public void beforePointCut(JoinPoint joinPoint, ApiSignature signature) {// 1. 验证通过,直接结束if (verifySignature(signature, Objects.requireNonNull(ServletUtils.getRequest()))) {return;}// 2. 验证不通过,抛出异常log.error("[beforePointCut][方法{} 参数({}) 签名失败]", joinPoint.getSignature().toString(),joinPoint.getArgs());throw new AppException(AppExceptionCodeMsg.BAD_REQUEST);}
}

2.3 Redis组件 (ApiSignatureRedisDAO.java)

package com.erp.common.signature.core.redis;import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;import java.util.concurrent.TimeUnit;/*** HTTP API 签名 Redis DAO** @author liming*/
@AllArgsConstructor
public class ApiSignatureRedisDAO {private final StringRedisTemplate stringRedisTemplate;/*** 验签随机数* <p>* KEY 格式:signature_nonce:%s // 参数为 随机数* VALUE 格式:String* 过期时间:不固定*/private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s";/*** 签名密钥* <p>* HASH 结构* KEY 格式:%s // 参数为 appid* VALUE 格式:String* 过期时间:永不过期(预加载到 Redis)*/private static final String SIGNATURE_APPID = "api_signature_app";// ========== 验签随机数 ==========public String getNonce(String appId, String nonce) {return stringRedisTemplate.opsForValue().get(formatNonceKey(appId, nonce));}public Boolean setNonce(String appId, String nonce, int time, TimeUnit timeUnit) {return stringRedisTemplate.opsForValue().setIfAbsent(formatNonceKey(appId, nonce), "", time, timeUnit);}private static String formatNonceKey(String appId, String nonce) {return String.format(SIGNATURE_NONCE, appId, nonce);}// ========== 签名密钥 ==========public String getAppSecret(String appId) {return (String) stringRedisTemplate.opsForHash().get(SIGNATURE_APPID, appId);}}

3. 签名验证流程

3.1 请求处理流程

  1. 请求进入

    • 客户端发送带有签名参数的HTTP请求
    • 请求必须包含:appId、timestamp、nonce、sign等参数
  2. 切面拦截

    • 通过AOP拦截带有@ApiSignature注解的接口
    • 获取请求对象和注解配置
  3. 参数验证

    • 验证请求头参数完整性
    • 检查时间戳有效性
    • 验证nonce唯一性
  4. 签名验证

    • 获取appSecret
    • 构建签名字符串
    • 计算服务端签名
    • 比对客户端签名
  5. 防重放处理

    • 将nonce存入Redis
    • 设置过期时间

3.2 详细验证步骤

ApiSignatureAspect.java

public boolean verifySignature(ApiSignature signature, HttpServletRequest request) {// 1. 验证请求头if (!verifyHeaders(signature, request)) {return false;}// 2. 获取appSecretString appId = request.getHeader(signature.appId());String appSecret = signatureRedisDAO.getAppSecret(appId);// 3. 验证签名String clientSignature = request.getHeader(signature.sign());String serverSignatureString = buildSignatureString(signature, request, appSecret);String serverSignature = DigestUtil.sha256Hex(serverSignatureString);// 4. 防重放处理String nonce = request.getHeader(signature.nonce());if (!signatureRedisDAO.setNonce(appId, nonce, signature.timeout() * 2, signature.timeUnit
http://www.dtcms.com/a/466758.html

相关文章:

  • 即梦图片批量去水印软件运营大管家AI图片去水印工具
  • 做网站怎么套模板网站站建设建技设术技术
  • Vue 程序使用host 0.0.0.0 实现监听本机所有可用的网络接口
  • ts-jest与其他TypeScript测试工具的对比
  • 学习16天:pytest学习
  • 奉贤青岛网站建设广州市制网公司
  • 江西中恒建设集团网站网站字体怎么设置
  • 泰安网站制作哪家好网站建设目的分析
  • 怎么看网站开发者页面渗透wordpress论坛
  • 求个网站好人有好报百度贴吧商城类网站建设方案
  • 使用 python-docx 库操作 word 文档(3):读取word文档的内容
  • 鸿蒙:从相册中选取图片,并转成PixelMap作为UI显示
  • 什么是网站什么是网址东莞网站设计服务商
  • STM32 读取引脚状态 -按键输入
  • 关于网站建设分类名字logo设计在线生成免费
  • 网站的二级网页关键词在线一键生成网页
  • 深圳夫博网站建设有限公司深夜的fm免费看
  • MySQL学习笔记09:MySQL高级特性深度学习(上):count函数、数据类型与分库分表核心原理
  • 失智老年人照护实训室建设指南:从意义到实践的全面解析
  • 10分钟上手OpenAI Agents SDK
  • 中文分析原始
  • JP4-8-MyLesson前台前端(二)
  • 做js题目的网站上海网站建设公司推荐排名
  • 网站建设效益分析代运营合同模板
  • 京东商品关键字搜索接口深度开发:从精准检索到商业机会挖掘的技术实现
  • 怎么看网站开发的发展wordpress能开发app
  • 项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
  • 统一高效图像生成与编辑!百度新加坡国立提出Query-Kontext,多项任务“反杀”专用模型
  • 网站建设要那些东西适合个人开店的外贸平台
  • window安装wsl