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

网关-开放API接口签名验证方案

接口安全问题

  • 请求身份是否合法?
  • 请求参数是否被篡改?
  • 请求是否唯一?

AppId&AppSecret

请求身份

为开发者分配AppId(开发者标识,确保唯一)和AppSecret(用于接口加密,确保不易被穷举,生成算法不易被猜测)。

防止篡改

参数签名

  • 按照请求参数名的字母升序排列非空请求参数(包含AppId),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringSignTemp;
  • 对stringSignTemp进行SHA256运算,并将得到的字符串所有字符转换为大写,得到sign值。

请求携带参数AppId和Sign,只有拥有合法的身份AppId和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到AppSecret(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。

重放攻击

虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。

timestamp+nonce方案

nonce指唯一的随机字符串,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。

然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储。

假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。

实现

请求接口:https://api.ssf.top/validate?b=13888888888&a=102

  • 生成当前时间戳timestamp=now()和唯一随机字符串nonce=random()
  • 生成签名SHA256(appId+timestamp+nonce+param+appSecret).toUpperCase()
  1. 如果是请求路径携带参数,则参数名升序配列后组装成请求参数串,如https://api.xxf.top/validate?b=13888888888&a=102,这里param为a=13888888888&b=102
  2. 如果是POST请求,并通过body传参,则param取body体的内容
  3. md5编码后统一转换为大写
  • 最终将appId,timestamp,nonce,及签名后的sign值设置到请求头中

网关端:

http://www.lryc.cn/news/175462.html

相关文章:

  • Linux知识点 -- 网络基础 -- 传输层
  • 计算机视觉与深度学习-经典网络解析-AlexNet-[北邮鲁鹏]
  • Django学习笔记-实现联机对战(下)
  • 一文了解什么SEO
  • SpringBoot+Jpa+Thymeleaf实现增删改查
  • 最快的包管理器--pnpm创建vue项目完整步骤
  • 算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树
  • Mock.js之Element-ui搭建首页导航与左侧菜单
  • robotframework在Jenkins执行踩坑
  • 关于ElementUI之首页导航与左侧菜单实现
  • 基于springboot小区疫情防控系统
  • 【k8s】YAML语言基础
  • AI时代的中国困境: ChatGPT为什么难以复制
  • 如何使用Docker安装最新版本的Redis并设置远程访问(含免费可视化工具)
  • 怒刷LeetCode的第8天(Java版)
  • Vue Hooks 让Vue开发更简单与高效
  • Go编程规范
  • premiere 新建 视频导入 视频拼接 视频截取 多余视频删除
  • 笔记01:第一行Python
  • 资产连接支持会话分屏,新增Passkey用户认证方式,支持查看在线用户信息,JumpServer堡垒机v3.7.0发布
  • uniapp项目实践总结(二十二)分包优化和游客模式
  • Unity中UI组件对Shader调色
  • PhpStorm 2023年下载、安装教程和好用插件,保姆级教程
  • 1960-2017年世界各国总和生育率数据
  • java.math.BigDecimal is not a supported Java type
  • Unity之Hololens开发如何实现UI交互
  • 二、ubuntu主机端tftp及nfs服务开发环境安装
  • Android 12修改usb tp触摸唤醒
  • #define定义标识符详解
  • 开发者必备!如何将闲置iPad Pro打造为编程工具,使用VS Code编写代码