接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:
Token受权机制:用户使用用户名密码登陆后服务器给客户端返回一个Token(一般是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,若是Token不存在,说明请求无效。Token是客户端访问服务端的凭证。
时间戳超时机制:用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,若是时间差大于必定时间(好比5分钟),则认为该请求失效。时间戳超时机制是防护DOS攻击的有效手段。
签名机制:将 Token 和 时间戳 加上其余请求参数再用MD5或SHA-1算法(可根据状况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以一样的算法获得签名,并跟当前的签名进行比对,若是不同,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。
拒绝重复调用(非必须):客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,两者时间一致能够保证不管在timestamp限定时间内仍是外 URL都只能访问一次。若是有人使用同一个URL再次访问,若是发现缓存服务器中已经存在了本次签名,则拒绝服务。若是在缓存中的签名失效的状况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为何要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也没法使用(如抓取数据)。
整个流程以下:算法
一、客户端经过用户名密码登陆服务器并获取Token 二、客户端生成时间戳timestamp,并将timestamp做为其中一个参数 三、客户端将全部的参数,包括Token和timestamp按照本身的算法进行排序加密获得签名sign 四、将token、timestamp和sign做为请求时必须携带的参数加在每一个请求的URL后边(http://url/request?token=123×tamp=123&sign=123123123) 五、服务端写一个过滤器对token、timestamp和sign进行验证,只有在token有效、timestamp未超时、缓存服务器中不存在sign三种状况同时知足,本次请求才有效
在以上三中机制的保护下,
若是有人劫持了请求,并对请求中的参数进行了修改,签名就没法经过;
若是有人使用已经劫持的URL进行DOS攻击,服务器则会由于缓存服务器中已经存在签名或时间戳超时而拒绝服务,因此DOS攻击也是不可能的;缓存