wcf afterreceiverequest获取body数据_阿里面试官的灵魂拷问:究竟如何保证API接口数据安全?...
前言
前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互。
网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,也可以伪造请求去获取或攻击服务器;也对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。那我们怎么去解决这些问题呢?
接口签名
我们先考虑一下接口数据被伪造,以及接口被重复调用的问题,要解决这个问题我们就要用到接口签名的方案,
签名流程
签名规则
1、线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret
2、加入timestamp(时间戳),5分钟内数据有效
3、加入临时流水号 nonce(防止重复提交),至少为10位。针对查询接口,流水号只用于日志落地,便于后期日志核查。针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。
4、加入签名字段signature,所有数据的签名信息。
以上字段放在请求头中。
签名的生成
签名signature字段生成规则
所有动态参数 = 请求头部分 + 请求URL地址 + 请求Request参数 + 请求Body
上面的动态参数以key-value的格式存储,并以key值正序排序,进行拼接
最后拼接的字符串 在拼接appSecret
signature = DigestUtils.md5DigestAsHex(sortParamsMap + appSecret)
即拼接成一个字符串,然后做md5不可逆加密
请求头部分
请求头=“appId=xxxx&nonce=xxxx×temp=xxxx&sign=xxx”
请求头中的4个参数是必须要传的,否则直接报异常
请求URL地址
这个就是请求接口的地址包含协议,如
https://mso.xxxx.com.cn/api/user
请求Request参数
即请求为Get方式的时候,获取的传入的参数
请求Body
即请求为Post时,请求体Body
从request inputstream中获取保存为String形式
签名算法实现
基本原理其实也比较简单,就是自定义filter,对每个请求进行处理;整体流程如下
1)验证必须的头部参数
2)获取头部参数,request参数,Url请求路径,请求体Body,把这些值放入SortMap中进行排序
3)对SortMap里面的值进行拼接
4)对拼接的值进行加密,生成sign
5)把生成的sign和前端传入的sign进行比较,如果不相同就返回错误
我们来看一下代码
以上是filter类,其中有个appSecret需要自己业务去获取,它的作用主要是区分不同客户端app。并且利用获取到的appSecret参与到sign签名,保证了客户端的请求签名是由我们后台控制的,我们可以为不同的客户端颁发不同的appSecret。
我们再来看看验证头部参数
image
上图其实就是验证是否传入值;不过其实有个很重要的一点,就是对此请求进行时间验证,如果大于10分钟表示此链接已经超时,防止别人来到这个链接去请求。这个就是防止盗链。
我们在来看看,如何获取各个参数
上面我们获取了各个参数,相对比较简单;我们在来看看生成sign,和验证sign
上面的流程中,会有个额外的安全处理,
· 防止盗链,我们可以让链接有失效时间
· 利用nonce参数,防止重复提交
在签名验证成功后,判断是否重复提交;
原理就是结合redis,判断是否已经提交过
总结
今天我们用签名的方式,对我们对外提供的接口起到了保护作用;但这种保护仅仅做到了防止别人篡改请求,或者模拟请求。
但是还是缺少对数据自身的安全保护,即请求的参数和返回的数据都是有可能被别人拦截获取的,而这些数据又是明文的,所以只要被拦截,就能获得相应的业务数据。
以上来自头条:作者:享学课堂|侵删
原文链接:https://www.toutiao.com/a6865544118026797579/
补充
另外,使用TOKEN+签名认证 保证请求安全性 。这个也是面试官经常问到的原理,这里我补充一下:
token+签名认证的主要原理是:
1.做一个认证服务,提供一个认证的webapi,用户先访问它获取对应的token
2.用户拿着相应的token以及请求的参数和服务器端提供的签名算法计算出签名后再去访问指定的api
3.服务器端每次接收到请求就获取对应用户的token和请求参数,服务器端再次计算签名和客户端签名做对比,如果验证通过则正常访问相应的api,验证失败则返回具体的失败信息
总结方案:
1、参数加密: 客户端和服务端参数采用RSA加密后传递,原则上只有持有私钥的服务端才能解密客户端公钥加密的参数,避免了参数篡改的问
2、请求签名:采用一套签名算法,对请求进行签名验证,保证请求的唯一性
wcf afterreceiverequest获取body数据_阿里面试官的灵魂拷问:究竟如何保证API接口数据安全?...相关推荐
- 88道BAT Java面试题 助你跳槽BAT,轻松应对面试官的灵魂拷问
88道BAT Java面试题 助你跳槽BAT,轻松应对面试官的灵魂拷问 前言: 备战金九银十逃脱不了面试官的灵魂拷问,笔者整理了88道Java面试,由于面试题太多文章没有包含答案,需要领取这些面试题答 ...
- 整天都说注解注解注解,你们了解注解吗?来自——面试官的灵魂拷问
注解 它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以'@注解名'在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解.单值注解.完整注解三类.它们都不会直接影响到 ...
- eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...
文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...
- xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?
作者:黄兆平 来源:http://blog.freshfood.cn/article/39 # 简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务 ...
- Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?
大家好,我是狂聊. 自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题. 一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状 ...
- hashmap存多少条数据_干货 | 面试官想问的HashMap,都在这一篇里面了!
来源公众号:非科班的科班 本文思维导图 HashMap简介 HashMap 是很常用的一种集合框架,其底层实现方式在 JDK 1.7和 JDK 1.8中却有很大区别.HashMap 是用来存储数据的, ...
- 64如何传入后台_如何保证API接口数据安全?
(给ImportNew加星标,提高Java技能) 转自:Java互联网架构师小马 链接:https://www.jianshu.com/p/e2d362ede89f 前后端分离的开发方式,我们以接口为 ...
- websphere mq 查看队列中是否有数据_如果面试官再问你消息队列,就把这篇甩给他!...
★★★建议星标我们★★★ 公众号改版后文章乱序推荐,希望你可以点击上方"Java进阶架构师",点击右上角,将我们设为★"星标"!这样才不会错过每日进阶架构文章呀 ...
- redis setnx 过期时间_阿里面试官:你确定你用过 Redis 分布式锁吗?
你有听说过 Redlock 吗? 别整些花里胡哨的,Redlock 全称 Redis Distributed Lock,即用 Redis 实现的分布式锁. Redis 热身知识 Redis 命令参考: ...
最新文章
- R语言可视化包ggplot2改变图例(legend)的标题(title)实战
- 我爱我家 CIO 刘东颖:如何靠六大维度提升“数字化”能力?|鲸犀峰会
- php strstartwith,PHP8新增的三个字符串函数 str_contains, str_starts_with, str_ends_with
- 电话号码的字母组合Python解法
- ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名
- Jstorm+Spring+mybatis整合
- ntop linux,linux下安装ntop
- iOS页面间跳转的方式
- Python 的低性能问题是无法忽视的
- Python PyCrypto,Paramiko模块安装和使用
- 解决QT编程出现 C2001错误
- 用递归求任意n个元素的全排列
- xp_cmdshell 用法
- TimeBake:part1
- 开源OA系统魔方OA ASP.Net 4.0或4.8
- 对于ssl中的pem文件和key 文件的理解
- WIN10解决“任务管理器被系统管理员禁用”问题
- [work] 一阶 二阶马尔可夫
- Tree-shaking
- charles + 雷电模拟器4进行手机抓包
热门文章
- mysql删除表外键_MySQL删除所有表的外键约束、禁用外键约束
- mysql存储过程的多表查询
- centos系统使用snap安装软件(还是别用吧)
- centos安装软件格式为rpm
- mysql 导出数据字典_python 查询 MySQL 数据库并返回字典集
- trunk口_Trunk的概念与设置
- think php5目录结构,目录结构 · ThinkPHP5.1完全开发手册 · 看云
- java heap 查看_使用VisualVM查看Java Heap Dump
- 数据结构 5-3-1 二叉树四种顺序遍历递归实现
- 数据结构(字符串)—— 循环旋转字符串的判断