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

简介: 最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。

最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。


安全措施


个人觉得安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻击;


下面具体看看都有哪些安全措施。


###


1 数据加密

我们知道数据在传输过程中是很容易被抓包的,如果直接传输比如通过http协议,那么用户传输的数据可以被任何人获取,所以必须对数据加密。


常见的做法对关键字段加密比如用户密码直接通过md5加密;现在主流的做法是使用https协议,在http和tcp之间添加一层加密层(SSL层),这一层负责数据的加密和解密;


2.数据加签

数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改;你可能会问数据如果已经通过https加密了,还有必要进行加签吗?


数据在传输过程中经过加密,理论上就算被抓包,也无法对数据进行篡改;但是我们要知道加密的部分其实只是在外网,现在很多服务在内网中都需要经过很多服务跳转,所以这里的加签可以防止内网中数据被篡改;


3. 时间戳机制

数据是很容易被抓包的,但是经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据;但是有不法者不关心真实的数据,而是直接拿到抓取的数据包进行恶意请求。


这时候可以使用时间戳机制,在每次请求中加入当前的时间,服务器端会拿到当前时间和消息中的时间相减,看看是否在一个固定的时间范围内比如5分钟内;这样恶意请求的数据包是无法更改里面时间的,所以5分钟后就视为非法请求了;


4. AppId机制

大部分网站基本都需要用户名和密码才能登录,并不是谁来能使用我的网站,这其实也是一种安全机制。

### 对应的对外提供的接口其实也需要这么一种机制,并不是谁都可以调用,需要使用接口的用户需要在后台开通appid,提供给用户相关的密钥;在调用的接口中需要提供appid+密钥,服务器端会进行相关的验证;


5. 限流机制

本来就是真实的用户,并且开通了appid,但是出现频繁调用接口的情况;这种情况需要给相关appid限流处理,常用的限流算法有令牌桶和漏桶算法;


6. 黑名单机制

如果此appid进行过很多非法操作,或者说专门有一个中黑系统,经过分析之后直接将此appid列入黑名单,所有请求直接返回错误码;


7. 数据合法性校验

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



如何实现


以上大体介绍了一下常用的一些接口安全措施,当然可能还有其他我不知道的方式,希望大家补充,下面看看以上这些方法措施,具体如何实现;


1. 数据加密

现在主流的加密方式有对称加密和非对称加密;大家也可以阅读下《用户密码怎么加密存储?》这篇文章。


对称加密:对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES,AES;优点是计算速度快,缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了;


非对称加密:服务端会生成一对密钥,私钥存放在服务器端,公钥可以发布给任何人使用;优点就是比起对称加密更加安全,但是加解密的速度比对称加密慢太多了;广泛使用的是RSA算法;


两种方式各有优缺点,而https的实现方式正好是结合了两种加密方式,整合了双方的优点,在安全和性能方面都比较好;


对称加密和非对称加密代码实现,jdk提供了相关的工具类可以直接使用,此处不过多介绍;关于https如何配置使用相对来说复杂一些,可以参考之前分享的文章,关注微信公众号:Java技术栈,可以在菜单中获取我整理的 N 篇 HTTP 教程,都是干货。


###


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有如下属性:


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


关于全局唯一Id生成的方式常见的有类snowflake方式等;


5. 限流机制

常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流;具体也可以看下《漏桶算法&令牌桶算法》这篇文章。


1.令牌桶限流


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


2.漏桶限流


漏桶算法的原理是按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量时,新的请求等待或者拒绝服务;可以看出漏桶算法可以强制限制数据的传输速度;


3.计数器限流


计数器是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流;


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

RateLimiter rateLimiter = RateLimiter.create(5);

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


6. 黑名单机制

如何为什么中黑我们这边不讨论,我们可以给每个用户设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等;或者我们直接通过分布式配置中心,直接保存黑名单列表,每次检查是否在列表中即可;


7. 数据合法性校验

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


总结


本文大致列举了几种常见的安全措施机制包括:数据加密、数据加签、时间戳机制、AppId机制、限流机制、黑名单机制以及数据合法性校验;当然肯定有其他方式,欢迎补充。


相关文章
THW
|
5月前
|
存储 安全
BadUSB 攻击原理
BadUSB攻击通过将USB设备伪装成键盘等HID设备,利用系统对HID的信任,在连接电脑后自动模拟键盘输入执行恶意指令,从而绕过传统安全防护,实现无需用户操作的秒级入侵。
THW
593 0
|
7月前
|
机器学习/深度学习 数据采集 监控
107_DPO:直接偏好优化
在大型语言模型(LLM)的发展历程中,如何让模型输出与人类偏好保持一致一直是研究的核心挑战。从早期的监督微调(SFT)到基于人类反馈的强化学习(RLHF),再到如今的直接偏好优化(DPO),对齐技术经历了显著的迭代与创新。
1391 1
|
10月前
|
存储 安全 数据安全/隐私保护
SD卡无法读取怎么办?修复方法汇总
SD卡无法读取怎么办?别急,先排查设备接口、检查卡体物理损伤,尝试恢复数据再格式化修复。教你一步步解决常见问题,保护重要文件安全!
|
存储 Java Apache
java 读取图片成二进制流
【2月更文挑战第10天】
747 1
|
人工智能 弹性计算 自然语言处理
技术分享 | 如何利用GPU云服务器加速AIGC训练
阿里云GPU云服务器提供GPU加速计算能力,能够实现GPU计算资源的即开即用和弹性伸缩。同时,配备阿里云自研的弹性RDMA网络,可以实现秒级的大规模RDMA组网,满足大模型计算过程中海量数据的高效传输需求。面向开发者,阿里云还推出了AI计算部署工具FastGPU,使开发者无需关注计算、存储、网络等资源的部署操作,即可达到简单适配、一键部署、随处运行的效果。
技术分享 | 如何利用GPU云服务器加速AIGC训练
|
SQL 缓存 PHP
探索PHP的魔法:从基础到高级技巧
在数字世界的广袤天地中,PHP 以其独特的魅力和强大的功能,成为了众多开发者的首选武器。本文不仅适合PHP初学者,帮助他们构建坚实的基础,也适合经验丰富的开发者,通过高级技巧和最佳实践提升他们的编程技艺。让我们一起踏上这段发现PHP无限可能的旅程吧!
193 1
|
应用服务中间件 nginx 容器
当 Kubernetes 遇到阿里云
当 Kubernetes 遇到阿里云 阿里云提供了丰富多样的云产品支持,包括ECS、VPC网络、经典网络、负载均衡SLB等等,可以帮助Docker应用轻松在云端运行。阿里云除了推出容器服务提供了一站式的容器应用管理解决方案,也在不断推动其他开源容器技术和阿里云的集成更好地满足用户的多样化需求。
59800 145
|
人工智能 C#
虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序
虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序
虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序
|
SQL 数据库 开发者
Flask、SQLAlchemy
【6月更文挑战第5天】
288 3
|
安全 开发工具 数据安全/隐私保护
MacOS安装FFmpeg
MacOS安装FFmpeg
12559 58

热门文章

最新文章