最近有一个项目需要对外提供接口,提供公有域名访问,接口与交易订单相关,所以安全性很重要;这里有一些常用的安全措施以及具体的实现方法。1.安全措施个人认为安全措施主要有两个方面。一方面,如何保证数据在传输过程中的安全;攻击;让我们来看看有哪些安全措施。1.数据加密我们知道数据在传输过程中很容易被窃取。如果是直接传输,比如通过http协议,用户传输的数据任何人都可以获取;因此,数据必须加密。通常的做法是使用关键字段加密,比如用户密码直接用md5加密;现在主流的方法是使用https协议在http和tcp之间加一个加密层(SSL层),负责数据的加解密;2、数据签名数据签名是指发送方生成一个不可伪造的数字串,以保证数据在传输过程中不被篡改;你可能会问如果数据已经被https加密了,还需要签名吗?数据在传输过程中经过加密处理,理论上即使抓包数据也无法被篡改;但是我们要知道,加密的部分其实只是在外网。现在很多服务在内网都需要经过很多次服务跳转,所以这里加上Signing可以防止内网数据被篡改;3、时间戳机制数据容易被抓取,但经过上述加密和签名处理后,即使获取到数据,也看不到真实数据;但也有不法分子不关心真实数据,直接获取抓取的数据包进行恶意请求;这时候可以使用时间戳机制,在每次请求的时候加上当前时间,服务端会把当前时间和消息中的时间相减,看是不是在一个固定的时间范围内,比如5分钟以内;这样的恶意请求包不能改变里面的时间,5分钟后就会被视为非法请求;4.AppId机制大多数网站基本上都需要用户名和密码才能登录,不是任何人都可以使用我的网站,这其实是一种安全机制;对外提供的相应接口也需要这样的机制,不是每个人都可以调用,需要使用接口的用户需要在后台激活appid,并提供相关的key给用户;调用接口需要提供appid+key,服务端会进行相关校验;5.限流机制本来就是真实用户,appid打开了,但是接口调用频繁;这种情况需要对相关appid进行限流,常用的限流算法有令牌桶和漏桶算法;6.黑名单机制如果这个appid进行了很多次非法操作,或者有专门的黑名单系统。经分析,直接将此appid加入黑名单,所有请求直接返回错误码;7、数据有效性校验这可以说是每个系统都会有的一种处理机制。只有当数据是合法的时候才会进行数据处理;每个系统都有自己的验证规则,当然也可能有一些规律性的规则,比如身份证的长度和组成,电话号码的长度和组成等;2.如何实现以上总的来说,介绍一些常用的接口安全措施。可能还有其他的方法我不知道,希望大家补充,下面我们就来看看以上的方法和措施,具体是如何实现的;1、目前主流的数据加密方式有对称加密和非对称加密;对称加密:对称密钥在加密和解密过程中使用的密钥是相同的。常见的对称加密算法有DES和AES;优点是计算速度快,缺点是在传输数据之前,发送方和接收方必须就秘钥达成一致,然后使用双方保存秘钥即可。如果一方的密钥泄露,加密后的信息将不安全;非对称加密:服务器端会生成一对密钥,私钥保存在服务器端,公钥可以发布给任何人使用;优点是比对称加密安全,但加解密速度比对称加密慢很多;RSA算法被广泛使用;两种方式各有优缺点,而https的实现恰好是结合了两种加密方式,综合了双方的优点,在安全性和性能上更胜一筹;对于对称加密和非对称加密代码的实现,jdk提供了相关的工具,可以直接使用,这里不做过多介绍;如何配置https使用起来比较复杂。可以参考我之前的文章HTTPS分析与实战2.数据签名。数据签名多采用md5算法。需要提交的数据通过一定的方式组合成一个字符串,然后通过md5生成一个加密后的字符串,也就是数据包的签名。可以看一个简单的例子:str:parameter1={parameter1}¶meter2={parameter2}&...¶metern={Parametern}$key={userkey};MD5.encrypt(str);注意最后一个用户密钥,客户端和服务端各有一份,会更安全;3.时间戳机制解密的数据,经过签名认证,得到数据包中的客户端时间戳字段,然后用当前服务器时间减去客户端时间,看结果是否在一个区间内。伪代码如下:longinterval=5*60*1000;//超时时间longclientTime=request.getparameter("clientTime");longserverTime=System.currentTimeMillis();if(serverTime-clientTime>interval){returnnewResponse("Exceededprocessingtime")}4.AppId机制生成一个唯一的AppId是的,key是使用字母和数字等特殊字符随机生成的就是这样;生成一个唯一的AppId,根据实际情况看是否需要全局唯一;但不管是否全局唯一,最好让生成的Id具有以下属性:趋势递增:这样在保存数据库时,索引性能更好;信息安全:尽量不要连续,很容易找到规律;生成全局唯一Id的常用方法有雪花法等;5、限流机制中常用的限流算法有:令牌桶限流、漏桶限流、计数器限流;(1)令牌桶限流令牌桶算法的原理是系统按照一定的速率向桶中放入令牌,桶满时丢弃令牌;Token,可以继续完成请求,否则等待或拒绝服务;令牌桶允许一定程度的突发流量,只要有令牌就可以处理,同时支持多个令牌;(2)leakybucket限流leakybucket算法的原理是以固定恒定的速率流出请求,传入请求的速率是任意的。当请求数超过桶的容量时,新的请求等待或拒绝服务;可见,漏桶算法可以强制限制数据传输速度;(3)计数器限流计数器是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;counter限流只要一定时间内请求总数超过设定的threshold值就被限流;基于上述算法的实现方式,Guava提供了基于令牌桶算法的RateLimiter工具类:RateLimiterrateLimiter=RateLimiter.create(5);上述代码表示一秒内只允许处理5个并发请求,上述方法只能用于限制单个应用的请求速率,不能进行全局限速;这时需要分布式限速,可以基于redis+lua实现;6.这里不讨论黑名单机制如何以及为什么。我们可以为每个用户设置一个状态,比如:初始化状态、正常状态、黑屏状态、关闭状态等;或者我们直接通过分布式配置中心保存黑名单名单,每次检查是否在名单中;7、数据合法性验证合法性验证包括:日常验证和业务验证;常规校验:包括签名校验、必填校验、长度校验、类型校验、格式校验等;业务验证:以实际业务为准,例如订单金额不能小于0等;综上所述,本文大致列举了几种常见的安全措施机制,包括:数据加密、数据签名、时间戳机制、AppId机制、限流机制、黑名单机制和数据合法性验证;当然肯定还有其他方式,欢迎补充
