开放 API 接口签名验证,让你的接口从此不再裸奔

沙海 2021年8月26日12:25:38Java评论60字数 3044阅读10分8秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/42331.html

为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。仅作本地加密使用,不参与网络传输),无法伪造合法的请求。即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。解决方案,即使请求参数被劫持也无法伪造二次重复请求。MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/42331.html

原文约 4840 | 图片 9 | 建议阅读 10 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/42331.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/42331.html

#Java基基文章源自JAVA秀-https://www.javaxiu.com/42331.html

333个文章源自JAVA秀-https://www.javaxiu.com/42331.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/42331.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/42331.html

每天 14:00 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/42331.html

文章源自JAVA秀-https://www.javaxiu.com/42331.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/42331.html

 文章源自JAVA秀-https://www.javaxiu.com/42331.html

文章源自JAVA秀-https://www.javaxiu.com/42331.html

来源:blog.csdn.net/qq_18495465/文章源自JAVA秀-https://www.javaxiu.com/42331.html

article/details/79248608文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

接口安全问题

  • 请求身份是否合法?文章源自JAVA秀-https://www.javaxiu.com/42331.html

  • 请求参数是否被篡改?文章源自JAVA秀-https://www.javaxiu.com/42331.html

  • 请求是否唯一?文章源自JAVA秀-https://www.javaxiu.com/42331.html

推荐下自己做的 Spring Boot 的实战项目:文章源自JAVA秀-https://www.javaxiu.com/42331.html

https://github.com/YunaiV/ruoyi-vue-pro文章源自JAVA秀-https://www.javaxiu.com/42331.html

AccessKey&SecretKey (开放平台)

请求身份

为开发者分配AccessKey (开发者标识,确保唯一)和SecretKey (用于接口加密,确保不易被穷举,生成算法不易被猜测)。文章源自JAVA秀-https://www.javaxiu.com/42331.html

防止篡改

参数签名文章源自JAVA秀-https://www.javaxiu.com/42331.html

  1. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;文章源自JAVA秀-https://www.javaxiu.com/42331.html

  2. 在stringA最后拼接上Secretkey得到字符串stringSignTemp;文章源自JAVA秀-https://www.javaxiu.com/42331.html

  3. 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。文章源自JAVA秀-https://www.javaxiu.com/42331.html

请求携带参数AccessKeySign ,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输 ),无法伪造合法的请求。文章源自JAVA秀-https://www.javaxiu.com/42331.html

重放攻击

虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。文章源自JAVA秀-https://www.javaxiu.com/42331.html

timestamp+nonce方案文章源自JAVA秀-https://www.javaxiu.com/42331.html

nonce指唯一的随机字符串 ,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。文章源自JAVA秀-https://www.javaxiu.com/42331.html

然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储文章源自JAVA秀-https://www.javaxiu.com/42331.html

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

实现

请求接口:http://api.test.com/test?name=hello&home=world&work=java
  • 客户端文章源自JAVA秀-https://www.javaxiu.com/42331.html

    1. 生成当前时间戳timestamp=now和唯一随机字符串nonce=random文章源自JAVA秀-https://www.javaxiu.com/42331.html

    2. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey)stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";文章源自JAVA秀-https://www.javaxiu.com/42331.html

    3. 拼接密钥SecretKeystringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&SecretKey=secret";文章源自JAVA秀-https://www.javaxiu.com/42331.html

    4. MD5并转换为大写sign=MD5(stringSignTemp).toUpperCase();文章源自JAVA秀-https://www.javaxiu.com/42331.html

    5. 最终请求http://api.test.com/test?name=hello&home=world&work=java&timestamp=now&nonce=nonce&sign=sign;文章源自JAVA秀-https://www.javaxiu.com/42331.html

  • 服务端开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

推荐下自己做的 Spring Cloud 的实战项目:文章源自JAVA秀-https://www.javaxiu.com/42331.html

https://github.com/YunaiV/onemall文章源自JAVA秀-https://www.javaxiu.com/42331.html

Token&AppKey(APP)

在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。文章源自JAVA秀-https://www.javaxiu.com/42331.html

Token身份验证

  1. 用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token 给客户端;文章源自JAVA秀-https://www.javaxiu.com/42331.html

  2. 客户端将Token保存在本地,后续发起请求时,携带此Token文章源自JAVA秀-https://www.javaxiu.com/42331.html

  3. 服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。文章源自JAVA秀-https://www.javaxiu.com/42331.html

安全隐患 :Token被劫持,伪造请求和篡改参数。文章源自JAVA秀-https://www.javaxiu.com/42331.html

Token+AppKey签名验证

与上面开发平台的验证方式类似,为客户端分配AppKey (密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法 生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击 解决方案,即使请求参数被劫持也无法伪造二次重复请求。文章源自JAVA秀-https://www.javaxiu.com/42331.html

实现

登陆和退出请求

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

登陆和退出流程文章源自JAVA秀-https://www.javaxiu.com/42331.html

后续请求

  • 客户端 和上述开放平台的客户端行为类似,把AccessKey改为token即可。文章源自JAVA秀-https://www.javaxiu.com/42331.html

  • 服务端开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

- END -文章源自JAVA秀-https://www.javaxiu.com/42331.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

开放 API 接口签名验证,让你的接口从此不再裸奔文章源自JAVA秀-https://www.javaxiu.com/42331.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/42331.html

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/42331.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/42331.html

文章源自JAVA秀-https://www.javaxiu.com/42331.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/42331.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/42331.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定