前端怎么做接口签名验证 -baijiahao_阿里一面:如何保证API接口数据安全?

2baf1dedf59960c7cc131c67270c6aaf.png
  1. ​前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互。网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,也可以伪造请求去获取或攻击服务器;也对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。那我们怎么去解决这些问题呢?

接口签名

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

a58a40aef9943eea3c7a891658152d72.png

签名规则

1、线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret

2、加入timestamp(时间戳),5分钟内数据有效

3、加入临时流水号 nonce(防止重复提交),至少为10位。针对查询接口,流水号只用于日志落地,便于后期日志核查。针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求

4、加入签名字段signature,所有数据的签名信息。

以上字段放在请求头中。

签名的生成

签名signature字段生成规则所有动态参数 = 请求头部分 + 请求URL地址 + 请求Request参数 + 请求Body
上面的动态参数以key-value的格式存储,并以key值正序排序,进行拼接
最后拼接的字符串 在拼接appSecretsignature = 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)对拼接的值进行加密,生成sign5)把生成的sign和前端传入的sign进行比较,如果不相同就返回错误
我们来看一下代码

1.@Componentpublic 
2.public class SignAuthFilter extends OncePerRequestFilter{
3.static final String FAVICON = "/favicon.ico";
4.static final String PREFIX = "attack:signature:";
5.}

0d092876489157c83c822bbacdcc1233.png

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

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

a7e24608bcb98517f57957763b6407ec.png

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

abf743db763a09cdd65a0ae144709491.png

fa6387291beb51110144d55d1e733b81.png

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

9f906516aba29f3e5dfcd96253d852ca.png

上面的流程中,会有个额外的安全处理,· 防止盗链,我们可以让链接有失效时间· 利用nonce参数,防止重复提交
在签名验证成功后,判断是否重复提交;原理就是结合redis,判断是否已经提交过

b8a19caa90fe033074f9dc185cba375c.png

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


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


老顾下一篇文章会介绍如何保证接口数据的安全,谢谢!!!

### 回答1: dockertoolbox-19.03.1.exe -baijiahao是一个命令行指令的语法,它包含了两部分内容,dockertoolbox-19.03.1.exe和-baijiahao。 dockertoolbox-19.03.1.exe是Docker Toolbox的安装文件的名称。Docker Toolbox是用于安装和使用Docker的一个方便的解决方案。它包含了一组工具,如Docker Engine、Docker Compose、Docker Machine等,用于管理和部署Docker容器。 -baijiahao是一个选项或参数,用于指定Docker Toolbox的安装和配置过程中的一些自定义设置。具体而言,-baijiahao可能是一个自定义的安装路径、配置文件或其他一些选项。 因此,dockertoolbox-19.03.1.exe -baijiahao是一个用于安装和配置Docker Toolbox的命令行指令。通过执行该命令,可以根据自己的需求设置Docker Toolbox的安装路径或其他一些参数,以满足个性化的安装和配置要求。 ### 回答2: dockertoolbox-19.03.1.exe -baijiahao 是一个命令行的参数,具体含义为运行名为dockertoolbox-19.03.1.exe的可执行文件,并入-baijiahao参数。根据参数的命名并无具体含义,可能是开发者自定义的用法。 通常情况下,dockertoolbox是一个用于在Windows和Mac系统上快速安装和管理Docker的工具。Docker是一种流行的容器化平台,可以帮助开发者更便捷地打包、分发和运行应用程序。 dockertoolbox-19.03.1.exe表明这是dockertoolbox工具的版本号为19.03.1,exe表示这是一个Windows可执行文件。 -baijiahao作为参数,根据具体命令的定义与用法,它可能表示一种配置选项或者是数据处理方式。具体而言,需要查看相应文档或者了解开发者提供的信息才能准确理解其含义。 总而言之,dockertoolbox-19.03.1.exe -baijiahao是一条具体的命令行指令,它表明在运行dockertoolbox工具的同时使用了-baijiahao参数,但在没有更多信息的情况下,对于-baijiahao参数的具体含义无法给出准确解释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值