这是小小本周的第一篇,

理论

理论主要体现在两个方面,分别是保证数据在传输过程中的安全性,以及数据如何到达服务器端如何获取到数据,如何不被攻击。

数据加密

数据在传输的过程中很容易被抓包,例如通过Http协议的时候,在用户传输数据的时候既然容易被获取,那么就必须进行加密,这里做法是有两种
1. 对关键字段进行md5加密,
2. 在http和tcp之间添加一层ssl层,这一层负责数据的加密和解密,即,https。

数据加签

数据加签就是由发送这产生一段无法伪造的数字串,来保证数据在传输过程中不被篡改,

时间戳机制

数据很容易抓包,经过加密,加签处理,这时候已经相当安全了,但是如果有不法者不关心真实的数据,直接拿到数据进行恶意请求,这个时候,需要使用时间戳机制,在每次请求中加入当前的时间,查看时间是否超过五分钟,如果超过五分钟就为非法请求,未超过为合法请求。

AppId机制

网站都需要用户名和密码才能登陆,并不是谁都能使用该网站,对应的对外接口需要实现一种机制,确定谁可以调用,这里使用的是appID + 用户密钥,在调用的接口中增加appID + 密钥在服务器端实现相应的验证。

限流机制

如果出现了频繁调用接口的情况,需要给appID进行限流处理,常用的限流算法有令牌桶和漏斗算法。

黑名单机制

如果appID有非法操作,直接列入黑名单,返回错误码。

数据合法性校验

对数据进行合法校验,例如身份证长度,电话号码长度的组成。

实践

数据加密

主流的加密方式有对称加密和非对称加密。

对称加密

对称加密在加密过程中和解密过程中秘钥是相同的,常见的有DES,AES,优点是计算速度快,缺点是数据在传送前,发送方和接收方都需要确定好秘钥,然后双方都能保存好秘钥,
非对称加密,服务器端生成秘钥,秘钥保存在服务器端,公钥给任何人使用,拿着公钥就可以登录秘钥,缺点过慢。

数据加签

这里使用比较多的为md5算法,多种方式组合成为一个字符串,通过md5生成一段加密字符串。一个简单例子。

str:参数1={参数1}&参数2={参数2}&……&参数n={参数n}$key={用户密钥};
MD5.encrypt(str);

时间戳机制

这里进行时间戳机制
代码如下

long interval=5*60*1000;//超时时间
long clientTime=request.getparameter("clientTime");
long serverTime=System.currentTimeMillis();
if(serverTime-clientTime>interval){
    return new Response("超过处理时长")
}

AppID 机制

生成一个唯一的AppId即可,密钥使用字母、数字等特殊字符随机生成即可;生成唯一AppId根据实际情况看是否需要全局唯一;但是不管是否全局唯一最好让生成的Id有如下属性:
趋势递增:这样在保存数据库的时候,使用索引性能更好;
信息安全:尽量不要连续的,容易发现规律;
关于全局唯一Id生成的方式常见的有类snowflake方式等;

限流机制

1.令牌桶限流
令牌桶算法的原理是系统以一定速率向桶中放入令牌,填满了就丢弃令牌;请求来时会先从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务;令牌桶允许一定程度突发流量,只要有令牌就可以处理,支持一次拿多个令牌;
2.漏桶限流
漏桶算法的原理是按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量时,新的请求等待或者拒绝服务;可以看出漏桶算法可以强制限制数据的传输速度;
3.计数器限流
计数器是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流;

具体基于以上算法如何实现,Guava提供了RateLimiter工具类基于基于令牌桶算法:

RateLimiter rateLimiter = RateLimiter.create(5);

以上代码表示一秒钟只允许处理五个并发请求,以上方式只能用在单应用的请求限流,不能进行全局限流;这个时候就需要分布式限流,可以基于redis+lua来实现;

黑名单机制

给用户设置一个初始的状态,正常状态,中间状态,关闭状态等等。

数据合法性校验

合法性校验包括:常规性校验以及业务校验;
常规性校验:包括签名校验,必填校验,长度校验,类型校验,格式校验等;
业务校验:根据实际业务而定,比如订单金额不能小于0等;

你微微的笑着,不和我说话,我什么都不求,只求你深情的给我来个点赞和分享。我是小小,我们下期再见!