概述
1.api接口保障安全性原则
1.有调用者身份
2.请求的唯一性
3.请求的参数不能被篡改
4.请求的有效时间
2.接口安全需求
1.启用https
2.signature签名
3.token登陆
4.验证时间戳
5.对要求安全性较高的接口数据进行加密传输(rsa、md5)
3.sign签名
api接口的安全性主要是为了保证数据不会被篡改和重复调用,实现方案主要围绕token、时间戳和sign三个机制展开。
1.token授权机制 用户使用用户名密码登陆后,服务器给客户端返回一个token(必须保证唯一,可以结合uuid和本地设备标识),存到缓存服务器中(redis),设置失效时间。
2.时间戳超时机制 用户每次请求都带上当前时间戳timestamp,服务器接收到后跟当前时间对比,如果时间差大于一定时间,则认为失效。时间戳超时机制是防御重复调用和爬取数据的有效手段。
3.签名机制
将“请求的api参数”+”时间戳“+“盐”进行md5算法加密,加密后的数据就是本次请求的签名signature,服务端接受到以后以同样的算法得到签名,进行比较,如果不一样,数名参数被更改过。签名机制保证了数据不会被篡改。
参考阿里云sdk包:help.aliyun.com/document_de…
api接口安全性设计
防伪装攻击
攻击:
- 接口被其他人调用
登陆之外的其他接口,使用token授权机制来判断请求是否有效
安全隐患是,token被劫持之后,可以伪造请求(重发攻击)和篡改参数(篡改攻击)
防篡改攻击
攻击:
- request请求参数被篡改
- response响应被篡改
签名机制 sign = md5(token+timestamp+nonce+业务参数)
将“API接口中的token、timestamp、nonce、业务参数"进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。
具体流程:
- 请求参数包括token、timestamp、nonce、业务参数、客户端signature(签名)
- 将token、timestamp、nonce、业务参数以字母升序(A-Z)排序,按'key1=value1'+ '&' + 'key2=value2'连接所有参数得到字符串signStr
- 将字符串signStr进行MD5运行得到新的签名newSignature
- newSignature和客户端发送的signature做比较
防重放攻击
攻击:
- 把请求原封不动地再发一遍
timestamp、nonce针对每个api保持唯一性
基于timestamp的方案
每次http请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。
一个实际的例子:
baidu.com/index/Info?… 如果黑客修改stime参数为当前的时间戳,则sign参数对应的数字签名就会失效,因为黑客不知道token值,没有办法生成新的数字签名
存在的问题: 黑通过抓包发送请到服务端求一般都会超过60S了,但是如果是在60s之内进行重放攻击,那就没办法了,所以这种方式不能保证接口被多次调用。
基于nonce的方案
nonce(Number once)的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,服务端会把每一次请求的nonce保存到数据
工作流程:每次处理HTTP请求时,首先判断该请求的nonce参数是否在服务端数据库中,如果存在则认为是非法请求。
让我们看一个实际的例子:
baidu.com/index/Info?… nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。 nonce参数作为数字签名的一部分,是无法篡改的,因为黑客不清楚token,所以不能生成新的sign。
存在的问题: 那就是对服务器来说永久存储所有接收到的nonce的代价是非常大的。
基于timestamp和nonce的方案
nonce的一次性可以解决timestamp参数时间限制的问题,timestamp可以解决nonce参数在数据库“集合”越来越大的问题。在timestamp方案的基础上,加上nonce参数,因为timstamp参数对于超过60s的请求,都认为非法请求,所以我们只需要存储60s的nonce参数的“集合”即可
看一个实际的例子:
baidu.com/index/Info?…
如果在60s内,重放该HTTP请求,因为nonce参数已经在首次请求的时候被记录在服务器的nonce参数“集合”中,所以会被判断为非法请求。 超过60s之后,stime参数就会失效,此时因为黑客不清楚token的值,所以无法重新生成签名
其他安全性
1.ip白名单
- 仅允许IP白名单内的IP访问
2.oauth2.0认证
- 三方登陆,代替使用密码
3.https
- tsl/ssl