对外接口的安全性主要在于两个方面,一个方面是保证数据在传输过程中的安全性,另一个方面是数据到达服务器端之后服务器端能够识别出不安全的数据以防止被攻击。
1.数据加密
我们知道,数据在传输的过程中是很容易被抓包的,如果直接传输,比如通过http协议,那么用户传输的数据是可以被任何人获取的,所以必须对数据进行加密。常见的做法是对关键字段加密,比如将用户密码直接通过md5加密,这样就算数据被抓包了,抓包者也无法获得用户密码的实际内容。而现在主流的做法则是使用https协议,在http和tcp协议之间添加一层加密层(ssl层),这一层负责数据的加密和解密。
实际上,主流的数据加密方式总体可以分为对称加密和非对称加密。
1.1对称加密
对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES和AES等。对称加密的优点是计算速度快,缺点则是在数据传送之前,发送方和接收方必须商定好密钥并保存好,如果其中一方的密钥被泄露的话,加密信息就不安全了。
1.2非对称加密
非对称加密的服务端会生成一对密钥,私钥放在服务器端,公钥则可以发布给调用方使用。非对称加密的优点是相比于对称加密来说要更安全一些,缺点则是加解密的速度要比对称加密要慢得多。非对称加密广泛使用的是RSA算法。
对称加密和非对称加密这两种方式各有优缺点,而https的实现方式正好是结合了这两种加密方式,整合了双方的优点,因此在安全和性能方面都比较好。
2.数据加签
所谓的数据加签,就是由发送者产生一段无法伪造的字符/数字串,来保证数据在传输的过程中不会被恶意篡改。那么如果数据已经通过https加密了,还需要进行数据加签吗?事实上,因为数据在传输的过程中已经经过了https加密,理论上即使被抓包,也无法对数据进行篡改,但是这些加密的部分只是在外网,而现在很多的服务都是在内网中经过很多的服务跳转,因此数据加签可以有效防止在内网环境中的数据篡改。
数据加签使用比较多的是md5算法,具体是将需要提交的数据和约定好的密钥通过某种方式组合成一个字符串,然后通过md5生成一段加密的字符串,这段加密的字符串就是数据包的签名,服务器会在接收请求的时候在后台根据约定好的组合方式在后台使用md5生成新的加密字符串,和数据包的签名做比较,不匹配则视为非法请求。
3.时间戳机制
数据是很容易被抓包的,但是经过如上的加密和加签处理,抓包者就算拿到数据也不是原始的数据。但是如果直接拿抓取的数据包进行恶意请求呢,因为抓包下来的数据包都是真实有效的,因此也可以请求成功。这时候为了防止这样的情况,就可以使用时间戳机制,在每次的请求中加入当前的时间,服务器端就会拿到当前时间和消息中的时间做减法,看看结果是否在一个固定的时间范围之内,比如五分钟之内,如果不在则视为非法请求。因为恶意请求的数据包是无法更改里面的时间的,所以这种做法能在一定程度上限制恶意请求的影响。
4.appid机制
大部分的网站基本上都是需要用户名和密码才能登录的,这实际上也是一种安全机制,而对外的接口也可以借用这一机制:需要使用接口的用户在后台开通appid,然后系统提供给用户相关的密钥,在调用接口的时候需要提供appid+密钥给服务器做相关的验证,验证通过才能正常调用,这就是appid机制。
一般来说生成一个唯一的appid,密钥则使用字母、数字等特殊字符随机生成即可。生成唯一的appid根据实际情况看是否需要全局唯一,但是不管是否全局唯一,最好是让生成的id有如下属性:
4.1趋势递增
这样在保存appid到数据库的时候,使用索引使性能更好。
4.2信息安全
尽量不要连续的,避免容易被发现规律。
更多的,生成全局唯一id的常见方式有类snowflake方式等。
5.限流机制
限流机制一般适用于这样的场景:本来就是真实的用户,并且开通了appid,但是出现了频繁调用接口的情况,因此需要给相关的appid做限流处理。常见的限流算法有令牌桶、漏桶算法和计数器限流等。
5.1令牌桶算法
令牌桶算法的原理是系统以一定的速率向桶内放入令牌,填满了就丢弃令牌。当请求到达时会先从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务。令牌桶允许一定程度的突发流量,只要有令牌就可以处理,也支持一次拿多个令牌。
5.2漏桶限流
漏桶算法的原理是按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量的时候,新的请求就会等待或者被拒绝。可以看出漏桶算法可以强制限制数据的传输速度。
5.3计数器限流
计数器是一种比较简单粗暴的算法,主要用于限制总并发数,比如数据库连接池,线程池和秒杀的并发数,只要一定时间内的总请求数超过设定的阀值就进行限流。
6.黑名单机制
如果某个appid进行过很多的非法操作,或者说专门有一个中黑系统,网站分析之后可以直接将此appid列入黑名单,所有的请求都直接返回错误码。
7.数据合法性校验
数据合法性校验可以说是每个系统都会有的处理机制,只有在数据是合法的情况下才会进行数据处理。一般来说每个系统都会有自己特定的验证规则,当然也可能会有一些常规性的规则,比如身份证长度和组成,电话号码长度和组成等。
数据合法性校验大体上可以分为常规性校验和业务校验。
7.1常规性校验
包括签名校验、必填校验、长度校验、类型校验和格式校验等。
7.2业务校验
业务校验就是每个系统的特定验证规则,根据实际业务而定,比如订单金额不能小于0等。
"真正的有钱人一般都是很低调的,比如说我,别看我每天都是骑着小黄车上下班,但是你们谁会想到我下班之后,晚上在家电风扇都是开三档。"