api安全设计要点,app api接口安全设计
http://www.jianshu.com/p/c6518a8f4040
接口的安全性主要围绕令牌、时间戳和签名三种机制进行设计,保证接口的数据不会被篡改和重复调用。让我们看看下面的细节:
Token的授权机制:用户使用用户名和密码登录后,服务器向客户端返回一个Token(通常是UUID),并将Token-UserId以键-值对的形式存储在缓存服务器中。收到请求后,服务器验证令牌。如果令牌不存在,则请求无效。令牌是客户端访问服务器的证书。
时间戳超时机制:用户的每个请求都取当前时间的时间戳。服务器接收时间戳并将其与当前时间进行比较。如果时间差大于某个时间(例如,5分钟),则该请求被视为无效。时间戳机制是防御DOS攻击的有效手段。
签名机制:令牌和时间戳用MD5或SHA-1算法加密(根据情况可以加盐),加密后的数据就是这个请求的签名标志。服务器收到请求后,用同样的算法得到签名,并与当前签名进行比较。如果不一样,说明参数已经更改,直接返回错误标识。签名机制确保数据不会被篡改。
重复调用拒绝(不必要):客户端第一次访问时,签名sign存储在缓存服务器中,超时周期设置为与时间戳的超时周期一致,可以保证在时间戳内或时间戳外只能访问一次URL。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在当前签名,将拒绝服务。如果缓存中的签名无效,如果有人使用同一个URL再次访问,就会被时间戳超时机制拦截。这就是为什么需要将时间戳的超时周期设置为与时间戳的超时周期一致。重复呼叫拒绝机制保证了URL被他人拦截,无法使用(如检索数据)。
整个过程如下:
1.客户端通过用户名和密码登录到服务器,并获得令牌。
2.客户端生成时间戳,并将时间戳作为参数之一。
3.客户端根据自己的算法对所有参数(包括令牌和时间戳)进行排序和加密,以获得签名sign。
4.将token、timestamp和sign作为请求时必须携带的参数添加到每个请求的URL(http://URL/request?令牌=123时间戳=123符号=123123123)
5.服务器编写一个过滤器来验证令牌、时间戳和签名。仅当令牌有效、时间戳未超时且缓存服务器中不存在签名时,此请求才有效。
在上述三种机制的保护下,
如果有人劫持请求,修改请求中的参数,签名无法通过;
如果有人利用劫持的URL进行DOS攻击,服务器会因为签名已经存在缓存服务器或者时间戳过期而拒绝服务,所以DOS攻击也是不可能的;
如果签名算法和用户名密码都暴露了,那大圣来了大概就不好用了。
作者:一一龙一一
链接:http://www.jianshu.com/p/c6518a8f4040
来源:简书
版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。