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

这篇具有很好参考价值的文章主要介绍了如何设计一个安全的对外接口 ?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

安全措施

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

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 如何配置使用相对来说复杂一些,可以参考本人的之前的文章 HTTPS 分析与实战

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 机制、限流机制、黑名单机制以及数据合法性校验;当然肯定有其他方式,欢迎补充。文章来源地址https://www.toymoban.com/news/detail-479932.html

到了这里,关于如何设计一个安全的对外接口 ?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 程序设计---对外接口可不仅仅是“给大佬递餐”,前置工作还是要做滴~

    先看下面代码中的两个方法。 execute → doPaymentAuthResultQuery ,一个方法接收到参数后,直接将参数原样传递给另一个方法。 View Code 然后,我们把这段代码稍作改动,主要是变更了第二个被调方法 doPaymentAuthResultQuery 的参数。大家来比较一下,改动前后,哪个更优一些。 View

    2024年02月05日
    浏览(45)
  • 设计一个LRU(最近最少使用)缓存

    约束和假设 我们正在缓存什么? 我们正在缓存Web Query的结果 我们可以假设输入是有效的,还是需要对其验证? 假设输入是有效的 我们可以假设它适应内存吗? 对 编码实现

    2024年01月24日
    浏览(67)
  • 如何设计一个牛逼的API接口

    在日常开发中,总会接触到各种接口。前后端数据传输接口,第三方业务平台接口。一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护。这篇文章重点讨论一下提供给第三方平台的业务接口应当如何设计?我们

    2023年04月24日
    浏览(52)
  • API 接口应该如何设计?如何保证安全?如何签名?如何防重?

    说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是

    2023年04月22日
    浏览(42)
  • 如何设计安全可靠的开放接口---之签名(sign)

    1. 如何设计安全可靠的开放接口—之Token 2. 如何设计安全可靠的开放接口—之AppId、AppSecret 3. 如何设计安全可靠的开放接口—之签名(sign) 4. 如何设计安全可靠的开放接口【番外篇】—关于MD5应用的介绍 5. 如何设计安全可靠的开放接口—还有哪些安全保护措施 6. 如何设计安全

    2024年02月10日
    浏览(48)
  • 【设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构】

    LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。 如图所示: 先来3个元素进入

    2024年01月24日
    浏览(46)
  • 【设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构】

    LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。 如图所示: 先来3个元素进入

    2024年01月21日
    浏览(57)
  • (C++) 如何设计一个安全的pop函数

    在经典数据结构, stack 和 queue 中有一个重要的函数那就是 pop() 表示弹出线性顶部的一个元素。 而在各种语言的标准数据结构中也自然有这些数据结构和对应的函数。 在C++中,pop()无返回,且对空对象pop()行为未定义。 空对象未定义可以理解,但是为什么不返回顶部元素呢?

    2024年03月13日
    浏览(38)
  • PHP 如何设计一个高安全的电商平台:淘宝/京东商品类API封装接口

    如何保证API接口安全 接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制 :用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务

    2024年02月09日
    浏览(59)
  • 设计模式之美-实战二:如何对接口鉴权这样一个功能开发做面向对象分析?

            面向对象的三个环节:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。只知道OOA、OOD、OOP只能说有一个宏观了解,我们更重要的还是要知道“如何做”,也就是,如何进行面向对象分析、设计与编程。         本文结合一个真实的开发案例,从基

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包