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

2023-10-27

来源:juejin.im/post/5dd5283af265da47a11f5578


1、前言

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

2、安全措施

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

1.数据加密

我们知道数据在传输过程中是很容易被抓包的,如果直接传输比如通过http协议,那么用户传输的数据可以被任何人获取;所以必须对数据加密,常见的做法对关键字段加密比如用户密码直接通过md5加密;现在主流的做法是使用https协议,在http和tcp之间添加一层加密层(SSL层),这一层负责数据的加密和解密;

2.数据加签

数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改;你可能会问数据如果已经通过https加密了,还有必要进行加签吗?数据在传输过程中经过加密,理论上就算被抓包,也无法对数据进行篡改;但是我们要知道加密的部分其实只是在外网,现在很多服务在内网中都需要经过很多服务跳转,所以这里的加签可以防止内网中数据被篡改;

3.时间戳机制

数据是很容易被抓包的,但是经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据;但是有不法者不关心真实的数据,而是直接拿到抓取的数据包进行恶意请求;这时候可以使用时间戳机制,在每次请求中加入当前的时间,服务器端会拿到当前时间和消息中的时间相减,看看是否在一个固定的时间范围内比如5分钟内;这样恶意请求的数据包是无法更改里面时间的,所以5分钟后就视为非法请求了;

4.AppId机制

大部分网站基本都需要用户名和密码才能登录,并不是谁来能使用我的网站,这其实也是一种安全机制;对应的对外提供的接口其实也需要这么一种机制,并不是谁都可以调用,需要使用接口的用户需要在后台开通appid,提供给用户相关的密钥;在调用的接口中需要提供appid+密钥,服务器端会进行相关的验证;

5.限流机制

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

6.黑名单机制

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

7.数据合法性校验

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

3、如何实现

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

1.数据加密

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

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

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

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.限流机制

常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流;

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

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

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

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

RateLimiter rateLimiter = RateLimiter.create(5);

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

6.黑名单机制

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

7.数据合法性校验

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

4、总结

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

END

推荐阅读

1. 在滴滴和头条干了 2 年后端开发,太真实…

2. Java:golang兄,听说你天生高并发?

3. 三个 Vue 后台管理模版,配合 Spring Boot 使用真香!

4. SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验

5. 卧槽!VSCode 上竟然也能画流程图了???

6.项目经理说:统一结果,统一异常,统一日志

7.两小时入门 Docker(好文推荐)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设计一个安全的对外接口 的相关文章

  • EDA笔记(1)--VHDL语言

    目的 摘录点自己容易忘的知识点 也可以供读者参考学习 EDA技术的概念 工作平台 计算机 开发环境 EDA软件 设计语言 硬件描述语言 HDL 试验载体 可编程逻辑器件 PLD 目标器件 ASIC芯片 应用方向 电子系统设计 EDA应用领域
  • LVM磁盘挂载&扩容

    磁盘不够了怎么使用逻辑卷的方式扩充磁盘呢 因为之前踩过坑 用混了fdisk和mount挂载 这次梳理下LVM挂盘和扩容方式 下载lvm2 预先下载程序包 若已下载则忽略 yum y install lvm2 离线下载可上腾讯软件源把rpm包
  • mysql数据库

    索引相当于字典的目录 用于查找数据 一般用B Tree索引 用该种数据结构来存储索引 InnoDB mysql的存储引擎 支持事务安全的引擎 支持外键 行锁 事务是他的最大特点 如果有大量的update和insert 转载于 https w
  • 玩转ChatGPT:Code interpreter (vol. 1)

    一 写在前面 喜大普奔 GPT 4传说中的Code interpreter插件已经可以用了 二 什么是Code interpreter 代码解释器 Code Interpreter 是一个工具 它能够读取和执行编程代码 这里有几个主要的功能
  • 如何将项目部署到服务器:从选择服务器到维护应用程序的全流程指南

    将项目部署到服务器是一个重要的技能 对于开发人员来说 它是必不可少的 在本文中 我将介绍一些关于如何将项目部署到服务器的最佳实践 一 选择服务器 在部署项目之前 你需要先选择一个适合你的服务器 如果你已经有一个可用的服务器 你可以直接使用它
  • 对象服务器文件服务器,传送对象到服务器

    h 文件中 h文件 png 代码如下 import interface LBNetWorkManager NSObject LBNetWorkManager netManager void Post NSString urlStr obj
  • nmap 操作系统探测

    1 操作系统探测原理 nmap 最著名的功能之一是用 TCP IP 协议栈 fingerprinting 进行远程操作系统探测 Nmap 发送一系列 TCP 和 UDP 报文到远程主机 检查响应中的每一个比特 在进行一打测试如 TCP IS
  • 【java】数组反转 已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,交换后的数组 arr = {50, 46, 37, 28

    public class Test05 public static void main String args 定义一个数组 用静态初始化完成数组元素的初始化 int arr 19 28 37 46 50 循环遍历数组 这一次初始化语句定义
  • 正则表达式校验邮箱

    正则表达式是一种用于匹配字符串的模式的工具 它可以用于验证邮箱地址的有效性 要用正则表达式校验邮箱地址 需要使用以下正则表达式 a zA Z0 9 a zA Z0 9 a zA Z0 9 0 61 a zA Z0 9 a zA Z0 9 a
  • ESP32的开发环境SDK4.3.1版本和编译环境搭建

    首先 到乐鑫的官网下载一个最完整的安装包 地址为 https dl espressif com dl esp idf idf 4 3 在这分为两种 在线安装和离线安装 在线安装与离线安装的区别 在线安装程序非常小 可以安装 ESP IDF
  • Mysql建表出现错误:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that correspo

    Mysql命令行sql语句建表报错 这里是你的SQL语法有错误 查看与MySQL服务器版本对应的手册 以确定使用 我的问题是sql语句里反引号用成了单引号 我这里用的是英文中的单引号 所以会有语法报错 正确的应该是键盘ESC键下的反引号 此
  • Python, Numpy求 list 数组均值,方差,标准差

    代码如下 import numpy as np array 1 3 5 7 9 求均值 arr mean np mean array 求方差 arr var np var array 求标准差 arr std np std array dd
  • 第二十八篇 SeNet模型解析

    文章目录 一 SENet概述 二 SENet 结构组成详解 三 详细的计算过程 SE模块代码详解 SENet 在具体网络中应用 代码实现SE ResNet 第一个残差模块 第二个残差模块 SEResNet18 SEResNet34模型的完整
  • 毕业设计 基于stm32的智能快递仓库环境监控系统 - 物联网 嵌入式

    本次设计的快递仓库的火灾报警系统通过主控单元将各个传感器的参数值采集回来 包括与消防安全相关的温度 湿度 烟雾等 主控制器 数据采集回来之后通过无线的方式将数据上传到远端的上位机上 由于这些参数都是有一个安全阈值的 当达到这个阈值的时候很可
  • ubuntu 17.10, cuda 9.1, cuDNN 7.0 安装caffe时runtest报错

    如果在runtest caffe时报如下错误 则 可将Makefile中 Debugging ifeq DEBUG 1 COMMON FLAGS DDEBUG g O0 NVCCFLAGS G else COMMON FLAGS DNDEB
  • 最全的cursor问题解答 The most complete Cursor question answer 2023.6.27

    2023 6 27 目前最新版本是Cursor Setup 0 2 35 x64 官网是https www cursor so 作者是https twitter com amanrsanger 使用操作 Ctrl k Edit Instru
  • 终于满足了我司QA的接口自动化测试统计报表要求

    以前我司接口测试用的工具比较多 有postman jmeter等 不同部门用的工具还不一样 即使同一部门开发自测用的接口测试工具和测试用的可能都不一样 项目到提测阶段 QA都会要求我们测试人员统计 项目有多少接口 是否每个接口都有被接口自动
  • 人生感悟之——因果关系

    2020年了 31岁 算是步入中年 偶有感悟 记录在案 待来年回头印证 近年来的感悟是 做事踏踏实实 实事求是很重要 有一是一 适当夸大我自己的能力是可以 但是夸的太大 未来的某一天我会付出代价 至少夸大的部分我需要花费足够的时间的努力来补
  • Protobuf如何集成到C++环境中(VS2019)

    文章目录 前言 下载安装Protocol Compiler和Protobuf Runtime 下载 编译安装Protobuf Runtime 使用Protocol Compiler生成 cc和 h文件 VS工程的配置 测试 前言 Proto
  • Spark集群搭建超详细教程

    Spark3 0 0集群搭建 前言 集群搭建具体步骤 Standalone模式 1 下载 spark 3 0 0 的jar包 2 上传并解压 3 配置SPARK HOME环境变量 4 修改配置 4 1 修改 spark defaults c

随机推荐

  • 课题:交通标志识别——设计思路与实现步骤记录

    一 准备数据集 选取两个典型的交通标志数据集 德国交通标志数据集GTSRB 与比利时交通标志数据集 选取两个数据集原因 1 便于后续对测试结果的对比 以及准确率差别的分析 2 二者图片格式相似 同样的程序二者兼容 无需重新编写代码 3 二者
  • 第10节 文件共享服务器—创建/访问共享文件及禁用共享服务

    这里写目录标题 0 引言 1 共享服务器概述 2 创建共享实验 2 1 创建共享文件夹并访问 2 2 创建隐藏共享文件夹并访问 3 权限控制逻辑 3 1 父子级文件共享权限的继承 3 2 远程权限与NTFS权限的控制关系 4 常用的与共享相
  • Vue+MySQL实现登录注册案例

    Vue MySQL实现登录注册案例 1 新建vue项目并连接数据库 具体步骤见vue连接mysql数据库 2 新建登录页面 注册页面和首页 在src views文件夹下 新建 login vue 登录页面 register vue 注册页面
  • 淘宝商品列表数据接口(支持价格、销量排序)

    淘宝商品列表数据接口是淘宝提供的一种可以获取淘宝商品信息的接口 通过该接口 可以获取到具有一定规则的商品信息 例如按照价格排序 按照销量排序等 接口返回的数据格式为JSON格式 可以方便地处理数据 我们可以通过调用淘宝提供的API 使用GE
  • Python计算机视觉编程 第一章 基本的图像操作和处理

    第一章 基本的图像操作和处理 1 1 PIL Python图像处理类库 1 1 1转换图像格式 1 1 2创建缩略图 1 1 3复制和粘贴图像区域 1 1 4调整尺寸和旋转 1 2Matplotlib 1 2 1绘制图像 点和线 1 2 2
  • 剑指 Offer 68 - II. 二叉树的最近公共祖先 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 68 II 二叉树的最近公共祖先 1 递归解法 代码思路 递归查询两个节点p q 如果某个节点等于节点p或节点q 则返回该节点的值给父节点 如果当前节点的左右子树分别包括p和q节点
  • python--hashlib加密模块

    Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等 什么是摘要算法呢 摘要算法又称哈希算法 散列算法 它通过一个函数 把任意长度的数据转换为一个长度固定的数据串 通常用16进制的字符串表示 摘要算法就是通过摘要函数f
  • ov9650摄像头驱动之——linux内核v4l2架构分析1

    本系列准备分为3 4篇来讲 因为说的太多会比较乱 v4l2视频驱动主要涉及几个知识点 摄像头方面的知识 摄像头厂家提供的芯片手册可以查看 要了解选用的摄像头的特性 包括访问控制方法 各种参数的配置方法 信号输出类型等 Camera解码器 控
  • Linux系统之wget命令的基本使用

    Linux系统之wget命令的基本使用 一 wget命令介绍 二 本次实践环境 三 wget命令的使用帮助 3 1 wget命令的基本语法 3 2 wget选项解释 四 安装wget工具 4 1 检查yum仓库状态 4 2 安装wget工具
  • 基于GD32F470的mbedtls 3DES算法测试

    3DES加密算法介绍 3DES数据加密算法是一种可逆的对称加密算法 也称三重数据加密算法 3DES块加密算法的设计用来提供一种相对简单的方法 即通过增加DES的密钥长度来避免类似的攻击 而不是设计一种全新的密码算法 目前3DES作为DES的
  • JS中逻辑与、逻辑或、按位与、按位或的运算结果

    在JavaScript中 和 是逻辑运算符 和 是位运算符 四个运算符主要区别是运算方法不一样 1 JavaScript中的位运算符 运算方法 两个数值的个位分别相与 同时为1才得1 只要一个为0就为0 举个例子 31 2 结果为2 理由
  • SQL语句 where,group by,having,order by执行顺序

    当一个查询语句同时出现了where group by having order by的时候 执行顺序和编写顺序 2010 06 06 15 34 使用count 列名 当某列出现null值的时候 count 仍然会计算 但是count 列名
  • 集成电路设计笔记(七)UVLO设计

    1 什么是UVLO 欠压锁定 Undervoltage Lockout 简称UVLO 是电子设备中在电源电压低于正常工程准位时 切断电源的电路 在嵌入式系统中常会用UVLO监控电池电压 若电压低于一定值 会直接切断电源 保护嵌入式系统的电路
  • Django 笔记7 – 服务器部署(Nginx + uWSGI + supervisor)

    Django 笔记7 服务器部署 Nginx uWSGI supervisor Django 系列笔记是笔者学习 实践使用 Django 的相关笔记 大量参考了知了课堂的 Django零基础到项目实战 教程 参考文档 Django官方文档
  • AI“看片儿”比人快,鉴黄师却说不靠谱?

    本文转载自钛媒体 一直以来 鉴黄师 被认为是一种神秘且高薪的职业 很多普通人都对这个职业充满了好奇 甚至有人想做个兼职 以为轻轻松松就能赚钱 但这个职业真的是 钱多事少 吗 事实上 鉴黄师 是自20世纪80年代起 公安部应 扫黄打非 需求而
  • java总结之基础类型与常量池

    1 基础类型有byte short int long char boolean float double八种 其中byte short int long char 的包装类型是存放在常量池 用来维护该类型所用到常量的有序集合 中的 浮点类型
  • IT6302 电源后面板的 DB9 接口输出为 TTL 电平,您需要通过附件电平转换后才可连接到 PC 机的串口上

    IT6302 电源后面板的 DB9 接口输出为 TTL 电平 您需要通过附件电平转换后才可连接到 PC机的串口上 该DB9接口的接口定义为 1 VCC 5V 由IT6302输出 2 RX 5V TTL电平 3 TX 5V TTL电平 5 G
  • html5超酷苹果风格,CSS3 苹果应用商店风格的5星评价组件

    CSS 语言 CSSSCSS 确定 body background 000 review holder position relative clear both display inline block left calc 50 50px
  • 刷题-leetcode-字节跳动高频题

    字节跳动研发岗高频考题之链表 lt 持续更新 7月8日 gt 链表 0 单链表的增删查改 1 反转链表 206 2 相交链表 160 3 环形链表II 142题 4 合并两个有序链表 5 合并K个排序链表 5 回文链表 6 环形链表 7 环
  • 如何设计一个安全的对外接口

    来源 juejin im post 5dd5283af265da47a11f5578 1 前言 最近有个项目需要对外提供一个接口 提供公网域名进行访问 而且接口和交易订单有关 所以安全性很重要 这里整理了一下常用的一些安全措施以及具体如何去