API接口开发安全性

一、先介绍几个基本概念

  • app_id

是用来标记你的开发者账号的, 是你的用户id,可以向第三方去申请

  • app_key 和 app_secret

第三方给你创建的:appKey公匙(相当于账号)AppSecret:私匙(相当于密码)

app_key 和 app_secret 是一对出现的账号, 同一个 app_id 可以对应多个 app_key+app_secret, 这样 平台就可以分配你不一样的权限, 比如 app_key1 + app_secect1 只有只读权限 但是 app_key2+app_secret2 有读写权限.. 这样你就可以把对应的权限 放给不同的开发者。简单来说就是你在第三方注册的用户名和密码

  • accesstoken

使用appKey+appSecret调用第三方获取验签接口获取,用来调用第三方业务接口时进行合法性校验,一般需要设置有效期

二、API接口开发安全性

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看

  • Token授权机制 

用户使用appKey+appSecret获取一个accessToken,并将Token-UserId以键值对的形式存放在缓存服务器中。之后的请求在请求头中需要加上accessToken,服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证

  • 时间戳超时机制

用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段

  • 签名机制

将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改

  • 对调用方ip加白名单

例如,微信openapi就需要加白名单

https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

  • 拒绝重复调用(非必须)

客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)

在以上三中机制的保护下,

如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

如果有人使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名或时间戳超时而拒绝服务,所以DOS攻击也是不可能的;

所有的安全措施都用上的话有时候难免太过复杂,在实际项目中需要根据自身情况作出裁剪,比如可以只使用签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只用Token机制就可以了。如何裁剪,全看项目实际情况和对接口安全性的要求~

三、常见问题

  • 为什么app_secret是可以改变的?

调用接口需要appid+app_secret生成对应的access_token(临时性),如果appid和app_secret被泄密,产生安全性问题,如果一但发现被泄密,可以重新生成一个app_secret

  • 做API接口,为什么access_token要放在Header头里传递?

如果是OAuth2, 使用 Header传递token是属于规范的一种,Header中有一个Authorization头专门用于存放认证信息
每一次登录,会生成一个新的Token, 此时旧的token并不会立即失效(取决于该token生成时,设置的失效时间)

例如请求苹果广告接口:需要将token放在请求头

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值