Java电商平台-开放API接口签名验证(小程序/APP)
说明:在实际的生鲜业务中,不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货:
接口安全问题
-
请求身份是否合法?
-
请求参数是否被篡改?
-
请求是否唯一?
AccessKey&SecretKey (开放平台)
请求身份
为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。【电商数据接口KEY注册】
防止篡改
参数签名
-
按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
-
在stringA最后拼接上Secretkey得到字符串stringSignTemp;
-
对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。
请求携带参数AccessKey和Sign,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。
重放攻击
虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。timestamp+nonce方案nonce指唯一的随机字符串,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储。假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。
实现
请求接口:http://api.test.com/test?name=hello&home=world&work=java
客户端
-
生成当前时间戳timestamp=now和唯一随机字符串nonce=random
-
按照请求参数名的字母升序排列非空请求参数(包含AccessKey)
stringA="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random";
-
拼接密钥SecretKey
stringSignTemp="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random&SecretKey=secret";
-
MD5并转换为大写
sign=MD5(stringSignTemp).toUpperCase();
-
最终请求
http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;
服务端
Token&AppKey(APP)
在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。
Token身份验证
-
用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端;
-
客户端将Token保存在本地,后续发起请求时,携带此Token;
-
服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。
-
安全隐患:Token被劫持,伪造请求和篡改参数。
Token+AppKey签名验证
与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击解决方案,即使请求参数被劫持也无法伪造二次重复请求。
实现
登陆和退出请求
登陆和退出流程
后续请求
客户端
-
和上述开放平台的客户端行为类似,把AccessKey改为token即可。
服务端
总结: 这个是目前第三方数据接口交互过程中常用的一些参数与使用示例,希望对大家有点帮助。
当然如果为了保证更加的安全,可以加上RSA,RSA2,AES等等加密方式,保证了数据的更加的安全,但是唯一的缺点是加密与解密比较耗费CPU的资源.
相关文章:

Java电商平台-开放API接口签名验证(小程序/APP)
说明:在实际的生鲜业务中,不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&am…...

Tale全局函数对象base
目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...

【启程Golang之旅】掌握Go语言数组基础概念与实际应用
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

COMSOL中液晶材料光学特性模拟
前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中,可以发现定义-变量中可以使用默认坐标作为变量,即xyz。因此,折射率也可…...

虚拟现实环境下的远程教育和智能评估系统(五)
查阅相关VR眼动注意力联合教育学相关论文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR(IEEE VR 2020) 摘要:我们提出了一种架构,使VR教学代理能够响应眼动追踪监控…...

【算法】模拟算法——Z字形变换(medium)
题解:模拟算法——Z字形变换(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 利用模拟,来解决问题。 首先创建出一个O(numRows*n)的数组来,并按照题目要求把每个字符按顺序填进去。 这里以numRows…...

上位机图像处理和嵌入式模块部署(f103 mcu获取唯一id)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于stm32f103系列mcu来说,一般每一颗原厂的mcu,都会对应一个唯一的id。那这个id可以用来做什么用呢?个人认为&…...

运筹学_3.运输问题(特殊的线性规划)
目录 前言3.1 平衡运输问题中初始基可行解确定运输问题平衡运输与非平衡运输平衡运输问题的数学模型单纯形法解决平衡运输问题,初始可行基的确认 3.2 平衡运输问题的最优解判别求检验数表上作业法 3.3 产销不平衡的运输问题运输问题中产大于销的问题运输问题中产小于…...

科研项目书写作学习(持续更新中...)
写好一个科研项目书也是科研中很重要的一部分,所以借这篇博客做一个积累。还是以模块化的方式吧,后面慢慢那再整合逻辑。可能写的也不是很好,慢慢提升吧~ 背景 科研项目书的背景怎么写?首先要突出问题的价值(也就是做此研究的动…...

男士内裤哪个品牌好一点?2024热门男士内裤推荐
男人的内裤保质期只取决于被别人看见的次数,如果某条内裤从未被别人看见过,那它永远都是你的新内裤。也就是说,只要穿着破内裤这尴尬的瞬间没被目击,男人就能永远和一条内裤在一起。 实际上如果长时间不更换男士内裤,…...

Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...

计算机tcp/ip网络通信过程
目录 (1)同一网段两台计算机通信过程 (2)不同网段的两台计算机通信过程 (3)目的主机收到数据包后的解包过程 (1)同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…...

42.开发中对String.format()的使用之空位补齐
用于空位补齐 Int x1; //对于传入的数字做处理,如果传入的数字不足三位,则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为:001 也可以简写成: String num2String…...

通用代码生成器应用场景四,跨编程语言翻译
通用代码生成器应用场景四,跨编程语言翻译 如果您有一个Java工程,想把它移植到Rust或Golang语言中去,希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的,保留了系统的SGS源文件或者SGS2的Excel模板,您可…...

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势
β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸(β-Nicotinamide mononucleotide,NMN)是一种生物活性分子,是一种辅酶Ⅰ(NAD)的前体,也是…...

深入理解 Go 语言中的字符串不可变性与底层实现
文章目录 前言1 字符串类型的数据结构组成2 为什么要这么设计数据结构?3 为什么说字符串类型不可修改?4 如何实现字符串的修改?5 为什么字符串修改的字面量用单引号?6 如何判断字符串的修改新建了一个字符串?7 字符串的…...

采购订单审批和取消例子
文章目录 1 Introduction2 Example 1 Introduction This is a exmaple for releaseing po and reseting po. 2 Example DATA:lw_in TYPE zmms015,lw_out TYPE zmms015_out,lt_head LIKE TABLE OF ZMMT003_head,lw_head TYPE ZMMT003_head,lt_item TYPE zmmt003_item_t,lt…...

PHP:集成Xunsearch生成前端搜索骨架
如果是安装宝塔,我们在集成xunsearch的时候就会比较简单,后面我们在介绍其他的接入方式; 首先我们进入到宝塔管理后台:【软件商店】-【输入xun】-【点击xunsearch】直接安装即可 安装成功之后,会自动在www/server中创…...

ThreadLocal详解,与 HashMap 对比
ThreadLocal原理,使用注意事项,解决哈希冲突方式->和HashMap对比 ThreadLocal 原理: ThreadLocal 是 Java 中的一个线程级别的变量,它允许您在不同线程之间存储和访问相同变量的不同副本,每个线程都拥有自己的副本&…...

flask流式接口
一、接口封装 from flask import Flask, request, Response, stream_with_context app Flask(__name__) app.logger.disabled Truedef chat_stream_(prompt):for new_text in [1,2,3]:yield new_textapp.route(/chat_stream, methods[POST]) def chat_stream():prompt requ…...

MatLab命令行常用命令记录
文章目录 MatLab常用命令行MatLab常用按键标点说明 MatLab常用命令行 Matlab常用命令用来管理目录、命令、函数、变量、工作区、文件及窗口。常用命令如下表 命令作用cd显示或改变当前文件夹load加载指定文件的变量dir显示当前文件夹或指定目录下的文件diary日志文件命令type…...

Linux —— MySQL操作(1)
一、用户与权限管理 1.1 创建与赋予权限 create user peter% identified by 123465 # 创建用户 peter,# %:允许所有用户登录这个用户访问数据库 刚创建的新用户是什么权限都没有,需要赋予权限 grant select on mysql.* to peter%; # 赋予…...

TCP四次握手与http协议版本区别
TCP四次挥手(图解)-为何要四次挥手 当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那 对于TCP的断开连接,这里就有了神秘的“四次挥手”。 第一次挥手:主机1(可以使客户端…...

【机器学习】洞悉数据奥秘:决策树算法在机器学习中的魅力
在机器学习的分类和回归问题中,决策树是一种广泛使用的算法。决策树模型因其直观性、易于理解和实现,以及处理分类和数值特征的能力而备受欢迎。本文将解释决策树算法的概念、原理、应用、优化方法以及未来的发展方向。 🚀时空传送门 &#x…...

redis(17):什么是布隆过滤器?如何实现布隆过滤器?
1 布隆过滤器介绍 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示: 根据 key 值计算出它的存储位置,然后将此位置标…...

STM32自己从零开始实操03:输出部分原理图
一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器,设计出以小电流撬动大电流的继电器电路。 (提示)电路需要包含:三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…...

Unity中将图片做成Prefab的步骤
Unity中将图片做成Prefab的步骤 在Unity中,将一张图片做成Prefab是一个常见的操作。Prefab是Unity中的一种资源类型,可以让你预先定义一个游戏对象,然后在场景中多次实例化它。以下是详细的步骤: 步骤一:准备图片资源…...

Web前端三大主流框架:React、Vue和Angular
在当前的Web开发领域,前端框架的选择对于项目的成功至关重要。作为一名资深的IT技术员,我对前端技术的发展和行业趋势保持着持续的关注。本文将介绍当前Web前端三大主流框架:React、Vue和Angular,并分析它们各自的优势。 React&a…...

安全风险 - 检测设备是否为模拟器
在很多安全机构的检测中,关于模拟器的运行环境一般也会做监听处理,有的可能允许执行但是会提示用户,有的可能直接禁止在模拟器上运行我方APP 如何判断当前 app 是运行在Android真机,还是运行在模拟器? 可能做 Framework 的朋友思…...

maven的下载以及配置的详细教程(附网盘下载地址)
文章目录 下载配置IDEA内部使用配置 下载 1.百度网盘下载 链接: https://pan.baidu.com/s/1LD9wOMFalLL49XUscU4qnQ?pwd1234 提取码: 1234 2.解压即可 配置 1.打开安装文件下conf下的settings.xml文件,我的如下 2.修改配置信息(目的是为了修改本地…...