• 安全的对外接口


    安全措施:

    1.数据加密(md5加密;使用https协议)

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

    3.时间戳机制(可以使用时间戳机制,在每次请求中加入当前的时间,服务器端会拿到当前时间和消息中的时间相减,看看是否在一个固定的时间范围内)

    4.AppId机制(在后台开通appid,提供给用户相关的密钥;在调用的接口中需要提供 appid+密钥,服务器端会进行相关的验证;

    5.限流机制(常用的限流算法有令牌桶和漏桶算法;)

    6.黑名单机制

    7.数据合法性校验

    ==========》

    1.数据加密

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

    1. 对称加密:对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES,AES;优点是计算速度快,缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了;
    2. 非对称加密:服务端会生成一对密钥,私钥存放在服务器端,公钥可以发布给任何人使用;优点就是比起对称加密更加安全,但是加解密的速度比对称加密慢太多了;广泛使用的是RSA算法;

    2.数据加签

    数据签名使用比较多的是md5算法,将需要提交的数据通过某种方式组合和一个字符串,然后通过md5生成一段加密字符串,这段加密字符串就是数据包的签名,可以看一个简单的例子:

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

    3.时间戳机制

    解密后的数据,经过签名认证后,我们拿到数据包中的客户端时间戳字段,然后用服务器当前时间去减客户端时间,看结果是否在一个区间内,伪代码如下:

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

    4.AppId机制

    生成一个唯一的AppId即可,密钥使用字母、数字等特殊字符随机生成即可;生成唯一AppId根据实际情况看是否需要全局唯一;但是不管是否全局唯一最好让生成的Id有如下属性:

    1. 趋势递增:这样在保存数据库的时候,使用索引性能更好;
    2. 信息安全:尽量不要连续的,容易发现规律;

    5.限流机制

    常用的限流算法包括:固定窗口计数器算法、滑动窗口计数器算法、漏桶限流、令牌桶限流

    固定窗口计数器算法

    规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现:给定一个变量counter来记录处理的请求数量,当1分钟之内处理一个请求之后counter+1,1分钟之内的如果counter=100的话,后续的请求就会被全部拒绝。等到 1分钟结束后,将counter回归成0,重新开始计数(ps:只要过了一个周期就讲counter回归成0)。

    滑动窗口计数器算法

    算的上是固定窗口计数器算法的升级版。滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:它把时间以一定比例分片比如一分钟分为6个区间,每个区间为10s。每过一定区间的时间,就抛弃最前面的一个区间,如下图所示。如果当前窗口的请求数量超过了限制数量的话,就拒绝后续请求。

    漏桶算法

    我们可以把发请求的动作比作成注水到桶中,我们处理请求的过程可以比喻为漏桶漏水。我们往桶中以任意速率流入水,以一定速率流出水。当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。如果想要实现这个算法的话也很简单,准备一个队列用来保存请求,然后我们定期从队列中拿请求来执行就好了。

    令牌桶算法

    令牌桶算法:请求在被处理之前需要拿到一个令牌,请求处理完毕之后将这个令牌丢弃(删除)。我们根据限流大小,按照一定的速率往桶里添加令牌。

     
  • 相关阅读:
    windy数
    微信授权网页登陆,oauth
    Win7/Win2008下IIS配置Asp网站启用父路径的设置方法(已解决)
    Html5学习笔记1 元素 标签 属性
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'user'
    POJ 3978(求素数)
    java内存模型(Java Memory Model)
    【Unity3D自学记录】Unity3D之自制小钟表
    HDU4126Genghis Khan the Conqueror(最小生成树+并查集)
    gcc学习(一)[第二版]
  • 原文地址:https://www.cnblogs.com/KL2016/p/16553800.html
Copyright © 2020-2023  润新知