在API开发过程中我们不妨会考虑接口安全问题;那么该如何防范呢,以下是我个人的简单总结。
这里只讨论数据加密问题,不讨论token认证问题,关于token认证问题,可以参考其他相关博客。
以下是本人用过的几种加密方法的精简版,当然,也可在以下基础上做些处理,如: 参数排序、 随机字符串、 时间戳、 签名等等,同时还可以配合https来使用 ,具体情况看自己的业务需求。
一、签名加密方式
1、客户端
param = {username:admin, password:123456}
timestamp = 158674345231
sign = HASH( param + "&" + timestamp)
2、服务端
_sign = HASH( param + "&" + timestamp);
if(current_time - timestamp > 60s){
exception("请求超时");
}
if(sign != _sign ){
exception("请求被篡改");
}
二、RSA + AES 双层加密
1、 客户端加密
data = AES_ENCODE( param, AES_KEY); // AES_KEY随机生成
ekey = RSA_ENCODE( AES_KEY, SERVER_PUBLIC_KEY );
2、 客户端解密
AES_KEY = AES_DECODE( ekey, CLIENT_PRIVATE_KEY );
param = AES_DECODE( data, AES_KEY);
三、 RSA + AES + 签名
1、 客户端加密
data = AES_ENCODE( param, AES_KEY); // AES_KEY随机生成
timestamp = 158674345231;
sign = HASH( data + "&" + timestamp );
ekey = RSA_ENCODE( AES_KEY, SERVER_PUBLIC_KEY );
2、 客户端解密
if(current_time - timestamp > 60s){
exception("请求超时");
}
_sign = HASH( data + "&" + timestamp );
if(sign != _sign){
exception("请求被篡改");
}
AES_KEY = AES_DECODE( ekey, CLIENT_PRIVATE_KEY );
param = AES_DECODE( data, AES_KEY);
#######################################################################
一、 重放攻击
简单直白的说就是攻击者把窃听到的数据原封不动地重新发送给接收方。 目的是为了实现了流量攻击、差错攻击,让数据传输延时、消耗网络带宽、干扰正常请求、 导致数据重传或误收...
1、增加随机字符串: 用户请求时额外增加一个随机字符串;
2、服务器收到请求参数后,用该随机字符串去查询是否存在相同的随机串,存在则抛异常;否则运行访问,并保持该字符串;
二、 XSS 跨站脚本攻击
利用脚本注入到网站中盗取用户的cookie,然后攻击者伪造成正常用户访问; 常被用户可以发表文字的论坛、博客等网站;
如:;
如果某网站没做相应的内容处理;用户A发表文章时,插入这句js脚本;则当用户B进入用户A发表的这篇文章展示的页面时,脚本自动将B的cookie发给A (www.xxx.com:A搭建的服务器);
防御方法:
1、将输入的特殊数据进行转义处理,比如说讲 < 转义成<;
2、避免用cookie存储重要数据
三、 CSRF 跨站请求伪造
简单的说就是:当用户浏览器登录A网站后; 在评论里看到www.xxxx.com这个链接,于是好奇的打开这个链接而被盗取cookie;从而被攻击者伪造成正常用户;
以上二和三点常通过盗取用户cookie攻击服务器;防御点则可以考虑不使用cookie;
防御方式:
1、避免用cookie存储重要数据
2、对用户输入的特殊数据做处理,避免用户输入的内容中含有非法链接,而从中盗取其他用户的信息。
四、 DDOS 攻击
通过抓取大量肉鸡;通过HTTP 三次握手原理伪造大量IP;让服务器无法完成和客户端二次握手,而重复发起二次握手请求; 导致服务器维护大量的半连接等待列表,造成服务器资源大量被占用而瘫痪。
长时间被DDOS攻击造成网络拥塞可能会被运营商拉入黑洞;
防御方法 : 云服务器自带N多G的DDOS攻击防御能力,但也是有限的。 为快速解决DDOS攻击,可以使用 弹性公网IP。 当服务器被DDOS攻击严重且被运营商拉入黑洞,一时半会是不可能解决的;所以这时候可以将服务器重新绑定到一个新的公网IP,然后将域名绑定该新的IP地址即可;