来源:https://www.toutiao.com/i6869353034188030471前言前端和后端分离开发方法,我们以接口为标准进行推广,定义接口,开发自己的功能,最后进行共同调整。
无论是开发本机APP,Webapp还是PC端软件,只要将前端和后端分开,就不可避免地要调用后端提供的接口进行业务交互。
对于网页或应用程序,只要抓取包,就可以清楚地知道请求所获得的数据,并且可以伪造请求以获取或攻击服务器。
对于爬虫工程师来说,这也是一个福音,并且很容易捕获您的数据。
那么我们如何解决这些问题呢?对于接口签名,我们首先考虑伪造接口数据和接口重复调用的问题。
为了解决这个问题,我们需要使用接口签名方案。
签名过程签名规则1.针对不同呼叫的appid和appsecret的脱机分发缔约方分配了不同的appid和appsecret 2.添加时间戳记(timestamp),数据在5分钟内有效3.添加临时序列号随机数(防止重复提交),位于至少10位数字。
对于查询界面,序列号仅用于登录日志,方便以后的日志验证。
必须在处理接口的有效期内验证序列号的唯一性,以避免重复请求。
4.添加签名字段签名,即所有数据的签名信息。
以上字段放置在请求标头中。
用于签名字段生成的签名生成规则。
所有动态参数=请求标头部分+请求URL地址+请求请求参数+请求正文。
上面的动态参数以键值格式存储并按键值的正顺序排序,然后进行拼接,最后进行拼接appSecret签名中的字符串=&DigestUtils.md5DigestAsHex(sortParamsMap& +& ; nbsp; appSecret)拼接成一个字符串,然后将md5不可逆加密的请求标头部分的请求标头部分=“ appId = xxxx& nonce = xxxx×tamp = xxxx& amp == xxx” 4必须传递请求标头中的参数,否则它将直接报告异常请求URL地址请求URL地址https://mso.xxxx.com.cn/api/user request请求参数表示请求是在Get方法中,当请求为Post时,将获得传入参数request Body,从请求输入流中获取请求正文,并将其保存为String形式。
签名算法实现的基本原理实际上是相对简单的,即为每个请求处理一个自定义的过滤器;整个过程如下:1)验证必要的标头参数2)获取标头参数,请求参数,URL请求路径,请求正文Body,将这些值放入SortMap中进行排序3)在SortMap中拼接这些值4)加密拼接的值以生成符号5)将生成的符号与从前端传入的符号进行比较,如果它们不相同,则返回错误。
让我们看一下代码@Component公共类SignAuthFilter扩展了OncePerRequestFilter {静态最终字符串FAVICON  =“ / favicon.ico”;静态最终字符串PREFIX& nbsp; =“ attack:signature:”;}以上是过滤器类。
其中,有一个appSecret需要您自己的企业来获取。
它的功能主要是区分不同的客户端应用程序。
并使用获得的appSecret参与签名,以确保客户的请求签名受我们的背景控制,并且我们可以为不同的客户发布不同的appSecrets。
让我们看一下验证头参数。
上图实际上是在验证该值是否传入。
但实际上,有一个非常重要的观点,那就是验证请求的时间。
如果超过10分钟,则该链接已超时,从而阻止其他人访问此链接进行请求。
这是为了防止热链接。
让我们看一下如何获取每个参数。
在以上过程中,将进行额外的安全处理以防止盗窃。
我们可以允许链接过期,并使用nonce参数来防止重复提交。
签名验证成功后,判断是否重复。
提交的原则是结合redis来确定是否已提交。
结束语今天,我们使用签名来保护我们提供给外界的接口。
但是此保护措施只能防止其他人篡改请求或模拟请求。
但是,仍然缺乏数据本身的安全保护,即所请求的参数和返回的数据可能被其他人截获,并且这些数据是无格式的