点击上方“阿拉奇学Java”,选择“置顶或者星标

每天早晨0000分,与你相约!

往日回顾:微信支付的架构到底有多牛?

接口安全问题

  • 请求身份是否合法?

  • 请求参数是否被篡改?

  • 请求是否唯一?

AccessKey&SecretKey (开放平台)

请求身份

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

防止篡改

参数签名

  • 按照请求参数名的字母升序排列非空请求参数(包含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";

  • 拼接密钥SecretKeystringSignTemp="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即可。

服务端

服务端流程
作者:Joker_Coding_来源:blog.csdn.net/qq_18495465/article/details/79248608_(END)
回复「进群」即可进入无广告技术交流群。同时送上250本电子书+学习视频作为见面 有你想看的精彩 微信支付的架构到底有多牛?
阿里云回应:压根没有“阿里云网盘”,我们做的不是网盘
讨论:Service层需要接口吗?
又一华为程序员进了ICU:压垮一个家庭,一张结算单就够
拼多多员工曝离职黑幕:要走可以,要离职证明,没有!
神奇的 SQL,Group By 真扎心,原来是这样!
【附下载连接】一套完整的 后台管理系统,赚钱就靠它了!
最精美详尽的 HTTPS 原理图!
百度网盘突然大调整,网友炸了!!!微软现允许员工永久在家工作;知乎上线视频创作工具;Flutter 1.22
程序员离职后收到原公司 2400 元,被告违反竞业协议赔 18 万
IDEA 2020.2 最新破解教程,有效期到2089年!
目前5000+ 人已关注加入我们明天见(。・ω・。)ノ♡

公司接口裸奔10年了,有必要用API接口签名验证吗?相关推荐

  1. 京东商品详情APP原数据API接口-(item_get_app-获得JD商品详情原数据API接口),京东API接口

    一.京东商品详情APP原数据API接口-(item_get_app-获得JD商品详情原数据API接口),京东API接口代码如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用k ...

  2. 跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)

    前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...

  3. jwt 长度_跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)

    前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...

  4. 拒绝接口裸奔!开放API接口签名验证!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/kChH 接口安全问题 请求身份是否合 ...

  5. yii2 提供接口给java_Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)...

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  6. 运营商二要素-运营商二要素认证-运营商二要素实名认证-运营商二要素认证接口-运营商二要素api-运营商二要素api接口

    运营商二要素接口描述 接口名称 运营商二要素验证_姓名 接口编号 JR-HYT-004 接口描述 运营商二要素验证_姓名 接口地址 /dmp/api 请求方式 POST 加密方式 RSA2 加密方式 ...

  7. python 微信公众号网页接口调用_GitHub - micsem00/WechatPCAPI: 微信PC版的API接口,可通过Python调用微信获取好友、群、公众号列表,并收发消息等功能。...

    WechatPCAPI 微信PC版的API接口,可通过Python调用微信获取好友.群.公众号列表,并收发消息等功能.可用于二次开发在线微信机器人.微信消息监控.群控软件.开发界面作多个微信控制软件等 ...

  8. 请求接口返回的是一个html_搜狗美图 API 接口请求调用

    搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图,本 API 接口可选择生成当日美图,也 ...

  9. php怎么根据接口文档实现功能,CodeIgniter+swagger实现 PHP API接口文档自动生成功能...

    一.安装swagger 1.首先需要有composer,没有的自行百度安装 2.下载swagger,打开网站https://packagist.org/packages/zircote/swagger ...

最新文章

  1. SQL语句统计错误率
  2. pygtk笔记--2.1:布局容器,VBox、Hbox、Alignment
  3. Ubuntu nginx 配置实例
  4. 关于StreamReader的构造函数
  5. 阿里灵杰:AI工程化助力产业数字升级
  6. 数据结构基础(7) --循环队列的设计与实现
  7. 豆瓣 为什么不用php,豆瓣网友是不是都疯了?
  8. 关于C#的数据绑定,存取数据库实例详解 (三)
  9. linux命令快速手记 — 让手指跟上思考的速度(四)
  10. .h5是什么文件_PPT转H5丨再也不用担心忘带U盘怎么办了
  11. 回收站引发ORACLE查询表空间使用缓慢
  12. “基金公司+互联网平台” 带来了什么考验?
  13. Rust之fluid用法(fltk ui 设计器)
  14. matlab中的pascal函数
  15. [RL 13] VDN (201706, DeepMind)
  16. 计算机打代码的技巧,工作超实用的电脑技巧
  17. 冬日魔幻之旅-seata+dubbo+nacos+springboot解决分布式事务的全网段唯一实践之作(上)
  18. 配置全局less变量;解决iphoneX、 iphone8 plus 键盘退下去仍占空间,导致无法点击;vue-photo-preview 配置正常,但无法触发图片的预览
  19. 华为android o适配名单,华为给出首批升级名单,这8款华为手机率先适配Android Q 10系统...
  20. 博客系统-写文章之富文本编辑器editor

热门文章

  1. 斐讯路由器宽带运营商服务器,新版斐讯p.to路由器的设置教程
  2. 永信至诚成功当选CNCERT网络安全应急服务支撑单位
  3. html字体铺盖颜色,这5种颜色的褥子不要去买,盖上会让你的家财散尽!
  4. Jenkins版本升级指南
  5. 傻妞对接TG/监控变量国内国外机视频教程 6.16
  6. Excel-VBA文件操作
  7. 大数据Python基础——第三章 字符串加列表练习
  8. 百度地图 pc浏览器获取经纬度
  9. TSN(时间敏感网络)纯干货分享
  10. python编程一个正方体的代码_Linux Shell经典面试题之请用shell或Python编写一个正方形(square.sh),接受用户输入的数字...