api接口的安全计划:利用token+sign+时间戳

打印 上一主题 下一主题

主题 845|帖子 845|积分 2535


服务端以api的方式将数据响应给客户端是目前的趋势,可以用在前后端分离的架构中,前后端分离之后,前后端人员可以或许更加专注于本身板块的东西,也可以用在服务端与服务端相互调用中。(日常最多的就是我们提供接口给前端开发人员,还有一些是提供给其他服务的模块的后端人员两种情况。)
下面我们偏重说一声,后端每个工程或者模块之间通过提供http接口。需要注意思量哪些东西:
拿到接口后,客户端就可以通过api获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的泉源是什么,有大概是别人非法调用我们的接口来获取数据,因此我们的api接口就要利用安全验证。
一、利用token进行用户身份认证
用户身份认证的流程图如下:

详细说明如下:
①、用户登录时,客户端请求接口,传入用户名和暗码
②、服务端对用户身份进行验证。若验证失败,则返回错误结果;若验证通过,则天生一个随机不重复的token,并将其存储在redis中(假设我们以存在redis中为例,也可以存储在DB中,存储在那里详细看本身即可),设置一个逾期时间。其中,redis的key为token,value为验证通过后得到的用户信息。
③、用户身份校验通过后,背景服务将天生的token返回客户端。客户端请求后续其他接口时,需要带上这个token。服务端会统一拦截接口请求,进行Token有效性校验,并从中获取用户信息,供后续业务逻辑利用。
二、利用sign防止传入参数被窜改
为了防止中间人攻击(客户端发来的请求被第三方拦截窜改,或接口被不信任的第三方进行调用),引入参数的签名机制。
详细步骤如下:
①、客户端和服务端约定一个加密算法(比如 md5加密 或 sha1加密 或 先md5加密后再sha1加密…等两边自行协商加密算法方式即可), 客户端发起请求时,将所有的非空参数按升序或降序拼接在一起,通过加密算法形成一个sign,并将其放在请求中一起通报给服务端。
②、服务端统一拦截接口请求,用接收到的非可空参数根据约定好的规则同样进行加密,和客户端传入的sign值进行比较。若一致则予以放行,提供接口对应的数据,若不一致则拒绝客户端的请求。
由于中间人不知道加密方法,也就不能伪造一个有效的sign。从而有效防止了中间人对请求参数的窜改或防止了其它不被我们信任的第三方调用接口。

三、用时间戳防止暴力请求
sign机制可以防止参数被窜改,但无法防ddos攻击(第三方利用正确的参数,不停的请求服务器,使之无法正常提供服务)。因此,还需要引入时间戳机制。
详细的操作为:客户端在天生sign值时,除了利用所有的参数和token外,再加一个发起请求时的时间戳。即:
  1. sign值来源 = 所有非空参数升序排序(或 降序排序)+token+timestamp
复制代码
而服务端则需要根据当前时间和sign值的时间戳进行比较,差值凌驾一段时间则不予通过客户端的请求,直接给客户端响应某些错误提示等。
若要求不高,则客户端和服务端可以仅仅利用精确到秒或分钟的时间戳,据此形成sign值来校验有效性。这样可以使一秒或一分钟内的请求是有效的。
若要求较高,则还需要约定一个解密算法,使服务端可以从sign值中剖析出发起请求的时间戳。
总结后的流程图如下:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表