如何设计一个安全的对外接口

最近,一个项目需要提供一个与外部世界的接口来提供公共域名访问,并且该接口与交易顺序相关,因此安全性非常重要。这里我们已经整理了一些常见的安全措施以及如何实施它们。

如何设计一个安全的对外接口

一、安全措施

我个人认为安全措施主要有两个方面:一方面,如何保证数据在传输过程中的安全性;另一方面,如何识别数据以及当数据到达服务器时如何不被攻击;让我们看看有什么安全措施。

1. 数据加密

我们知道数据在传输过程中很容易被捕获。如果它是直接传输的,例如通过http协议,用户传输的数据可以被任何人获得。因此,数据必须加密。常用方法加密密钥字段,例如直接通过md5加密的用户密码。目前主流的方法是使用https协议,在http和tcp之间增加一个加密层(SSL layer),负责数据加密和解密。

2. 数据加签

数据签名是发送方无法伪造的数字字符串,以确保数据在传输过程中不会被篡改。你可能会问,如果数据已经被https加密,有必要签名吗?数据在传输过程中被加密,理论上,即使被捕获,也不能被篡改。然而,我们需要知道加密部分只在外部网络中。现在许多服务需要通过内部网络中的许多服务跳转,所以这里的签名可以防止内部网络中的数据被篡改。

3. 时间戳机制

数据很容易捕获,但是经过上述加密和签名处理后,即使你得到了数据,你也看不到真正的数据。然而,一些罪犯并不关心真实数据,而是直接获取恶意请求的捕获数据包。此时,可以使用时间戳机制将当前时间添加到每个请求中,服务器端将获得当前时间和消息中的时间之间的减法,以查看它是否在固定的时间范围内,例如5分钟。这样,恶意请求的数据包不能改变内部时间,因此5分钟后将被视为非法请求。

4. AppId机制

大多数网站基本上都需要用户名和密码才能登录。没有人可以使用我的网站。这实际上是一种安全机制。事实上,相应的外部提供的接口也需要这样的机制。不是每个人都能称之为。需要使用该界面的用户需要在后台打开appid,并向用户提供相关密钥。调用接口需要提供Appid密钥,服务器端将进行相关验证;

5. 限流机制

是一个真正的用户,已经打开了appid,但是经常调用接口。在这种情况下,需要限制相关的appid。常用的限流算法包括令牌桶和漏桶。

6. 黑名单机制

如果这个应用程序id做了许多非法操作,或者如果有一个特殊的黑白系统,它将在分析后被直接列入黑名单,所有请求将直接返回错误代码;

7. 数据合法性校验

这可以说是每个系统都会有的处理机制。只有当数据合法时,才会进行数据处理。每个系统都有自己的验证规则,当然,也可能有一些常规规则,如身份证的长度和组成、电话号码的长度和组成等。

二、如何实现

以上一般介绍一些常用的接口安全措施,当然可能还有其他我不知道的方法,希望你能补充一下,让我们看看上面的方法和措施以及如何实现它们。

1. 数据加密

现在主流的加密方法是对称加密和非对称加密;

这两种方法各有利弊,而https实现只是两种加密方法的组合,它融合了双方的优势,在安全性和性能方面相对较好。

对称加密和非对称加密代码实现,jdk提供了可以直接使用的相关工具类,但这里介绍的不多;

配置和使用https相对复杂。请参考我上一篇文章《HTTPS分析与实战》。

2. 数据加签

data signature使用md5算法,该算法以某种方式将要提交的数据组合成字符串,然后通过md5生成加密字符串。这个加密的字符串是数据包的签名。您可以看到一个简单的例子:

str:参数1={参数1}参数2={参数2}.参数n={参数n}$key={用户密钥};MD5 .加密(字符串);

注意最终的用户密钥,客户机和服务器都有一个副本,这样会更安全。对于签名认证后的

3. 时间戳机制

的解密数据,我们在数据包中获取客户端时间戳字段,然后使用服务器的当前时间来减少客户端时间,以查看结果是否在一个时间间隔内。伪代码如下:

longinterval=5 * 60 * 1000//time out long client time=request . get parameter(‘ client time ‘);长服务器时间=系统。当前内存();如果(server time-client time interval){ return new response(‘长于处理时间’)}

4. AppId机制

可以生成唯一的AppId,密钥可以使用字母和数字等特殊字符随机生成。生成唯一的AppId取决于实际情况,看是否需要全局唯一性;但是,最好让生成的标识具有以下属性,而不管它是否是全局唯一的:

趋势正在增加:这将在保存数据库时提供更好的索引性能;信息安全:尽量不要连续且容易找到规则;

生成全局唯一标识的常用方法包括雪花方法等。

5. 限流机制

常见的限流算法包括令牌桶限流、漏桶限流和计数器限流。

(1)令牌桶电流限制

令牌桶算法的原理是系统以一定的速率将令牌放入桶中,并在令牌填满时丢弃令牌。当请求到来时,令牌将首先从桶中取出。如果令牌可以取出,请求可以继续完成,否则服务将被等待或拒绝。令牌桶在一定程度上允许突发流量,只要有令牌就可以处理,一次支持多个令牌;

(2)漏桶限流

漏桶的原理是以固定的恒定速率流出请求,流入请求速率是任意的。当请求数量超过存储桶容量时,新请求等待或拒绝服务;可以看出漏桶会限制数据传输速度;

(3)Counter Current Limit

Counter是一种相对简单而粗糙的算法,主要用于限制总并发数,如数据库连接池、线程池和秒kill的并发数。如果在一定时间内请求的总数超过了设定的阈值,计数器将限制电流。

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

上述代码表示每秒只允许处理五个并发请求,并且上述方法只能用于单个应用请求流限制,而不能用于全流限制;此时,需要分布式限流,并且可以基于Redisla来实现。

6. 黑名单机制

为什么没有关于黑色和中号的讨论?我们可以为每个用户设置一个状态,如初始化状态、正常状态、黑色和中等状态、关闭状态等。或者我们可以通过分布式配置中心直接保存黑名单列表,并每次检查它是否在列表中。

7. 数据合法性校验

合法性验证包括:常规验证和业务验证;

总结

本文列出了几种常见的安全机制,包括数据加密、数据签名、时间戳机制、AppId机制、限流机制、黑名单机制和数据合法性检查。当然肯定还有其他方法,欢迎补充。

 

极牛网精选文章《如何设计一个安全的对外接口》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/4605.html

(39)
打赏 微信公众号 微信公众号 微信小程序 微信小程序
主编的头像主编认证作者
上一篇 2019年11月20日 下午10:57
下一篇 2019年11月21日 上午8:00

相关推荐

发表回复

登录后才能评论
扫码关注
扫码关注
分享本页
返回顶部