如何保证API接口数据安全?

点击上方“码农突围”,马上关注
这里是码农充电第一站,回复“666”,获取一份专属大礼包
真爱,请设置“星标”或点个“在看”

如何保证API接口数据安全?_第1张图片

转自:Java互联网架构师小马

链接:https://www.jianshu.com/p/e2d362ede89f

前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互

网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,也可以伪造请求去获取或攻击服务器;也对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。那我们怎么去解决这些问题呢?

接口签名

我们先考虑一下接口数据被伪造,以及接口被重复调用的问题,要解决这个问题我们就要用到接口签名的方案,

签名流程

如何保证API接口数据安全?_第2张图片

签名规则

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×tamp=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进行比较,如果不相同就返回错误

我们来看一下代码

如何保证API接口数据安全?_第3张图片

如何保证API接口数据安全?_第4张图片

以上是filter类,其中有个appSecret需要自己业务去获取,它的作用主要是区分不同客户端app。并且利用获取到的appSecret参与到sign签名,保证了客户端的请求签名是由我们后台控制的,我们可以为不同的客户端颁发不同的appSecret

我们再来看看验证头部参数

如何保证API接口数据安全?_第5张图片

上图其实就是验证是否传入值;不过其实有个很重要的一点,就是对此请求进行时间验证,如果大于10分钟表示此链接已经超时,防止别人来到这个链接去请求。这个就是防止盗链。

我们在来看看,如何获取各个参数

如何保证API接口数据安全?_第6张图片

如何保证API接口数据安全?_第7张图片

上面我们获取了各个参数,相对比较简单;我们在来看看生成sign,和验证sign

如何保证API接口数据安全?_第8张图片

上面的流程中,会有个额外的安全处理,

· 防止盗链,我们可以让链接有失效时间

· 利用nonce参数,防止重复提交

在签名验证成功后,判断是否重复提交;

原理就是结合redis,判断是否已经提交过

如何保证API接口数据安全?_第9张图片

总结

今天我们用签名的方式,对我们对外提供的接口起到了保护作用;但这种保护仅仅做到了防止别人篡改请求,或者模拟请求。

但是还是缺少对数据自身的安全保护,即请求的参数和返回的数据都是有可能被别人拦截获取的,而这些数据又是明文的,所以只要被拦截,就能获得相应的业务数据。

最近有有不少老铁在后台留言说,想进大厂,但是算法不好。最近我整理了一份刷题实录,这份刷题实录,也让我进了心仪的大厂。现在开放分享给大家。希望对大家有所帮助。



任何的算法题,如同写作文一样,都有一些模板可以套用的。比如面试常考的DP(动态规划),难的是一些关键点是否能想清楚。比如你能写出动态转移方程,这题基本上就可以AC了。
整个刷题实录内容,包括 双子针、动态规划、二分查找、贪心算法、深度优先搜索、字符串、递归、字典树、排序、链表等相关专题内容。图文并茂,附有刷题答案源码。





刷题任务的题目,是根据题目的类型来汇总的,总结了八个类别,每个类别下面也总结了5个左右的题型,帮助大家分门别类的突破,所以刷起来相对会更有重点和针对性。如果从头到尾的刷,每周按顺序刷42题,很容易让自己坚持不下来,也会觉得很枯燥。所以在制定计划的时候可以让这个计划变得更“有趣"和针对性,让它看起来更容易实现一点,才会更容易坚持。




目前上述内容已打包成完整电子书,具体获取方式如下:
扫描关注 程序猿进阶 公众号;
在 程序猿进阶 公众号后台回复关键词「9999」获取下载地址。

扫描关注,回复"9999"即可下载
最近热文•  他是阿里P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!•  判了!40岁程序员被判7年,曾提出系统安全问题被无视,怒删9TB财务数据及系统数据!•  别瞎学了,这几门语言要被淘汰了!•  突发!继22岁拼多多女员工猝死后,又一悲剧:拼多多员工家中跳楼自杀!公司紧急通告!•  我酸了!又是别人家公司!百度新年发 U 奖金鼓励员工在这里,我为大家准备了一份2020年最新最全的《Java面试题及答案V3.0》,这套电子书涵盖了诸多后端技术栈的面试题和答案,相信可以帮助大家在最短的时间内复习Java后端的大多数面试题,从而拿到自己心仪的offer。截了张图,大家可以仔细查看左边的菜单栏,覆盖的知识面真的很广,而且质量都很不错。
资料获取方法
扫描下方二维码后台回复关键词:Java核心整理明天见(。・ω・。)

你可能感兴趣的:(java,webservice,jwt,restful,接口)