基于http请求的一种安全校验认证方案记录
目录
需求简述
设计方案
参考代码
可优化点
需求简述
日常的开发对接过程中,经常会遇到需要给其他合作伙伴或者其他系统通过接口的方式提供数据,或者有些接口是需要提供通用能力出去的。 从安全的角度考虑,我们往往需要给接口加一些安全校验,不能让接口裸奔,不然任何系统任何人只要网络通就能调用,这就很容易有安全隐患。
如何做接口的安全校验? 常见的一种方式就是JWT,给调用方分配一个token,调用方调用之前先获取token,调用的时候将token带上,后端校验token是否合法,并做拦截和放通。 但是token通过F12查看请求,或者网络抓包都可以轻松拿到,拿到手,就很容易进行模拟请求,所以这种方案还是不够安全。
当然我们也可以通过防火墙的方式,直接限制调用方的IP,这种方式相对简单,但是对于网络环境有要求,并且有实施的复杂度。
设计方案
我们在token方案的基础上做一些改造。通过base64编码+不可逆加密以及时间戳校验的方式,增强接口校验的安全性。
首先创建一个外部应用表,主要用于存储分配给外部应用的app_code和app_secret,也可以加一些其他字段,比如:备注信息、系统基本信息等。
约定所有提供给外部调用的接口,都会先校验请求header中是否带有access_token,并校验access_token的有效性。
access_token的生成规则为:base64(app_code|时间戳|app_secret+时间戳))
服务端会拦截所有外部接口的请求,拿出access_token,进行base64解码,通过|分隔字符串,取出app_code、时间戳、不可逆加密串。 通过app_code到外部应用表查询对应的app_secret,然后根据入参中的时间戳,按照规则生成不可逆的加密串,然后判断加密串是否相等,相等的话就认为请求合法。
这里其实还有个细节,那就是这种方案有和前面提到的token方案有什么区别? 如果通过F12或者抓包拿到access_token也同样可以无限制模拟请求了。
所以,这里我们要对时间戳也加上校验,即一个时间戳有效期只能有一次,拦截器中会记录调用的时间戳,每次请求过来,会先判断时间戳是否已经存在,如果存在,直接判定请求失败,这就能将恶意模拟已请求的拦截住,除非模拟方清晰的知道加密规则以及对应分配给调用方的code和secret信息。
参考代码
提供一些可参考的代码如下,关于base64以及加密串生成及校验的参考代码如下:
public class InterFaceCheck
{//base64加密public static String base64Encode(String str){return Base64.getEncoder().encodeToString(str.getBytes());}//base64解密public static String base64Decode(String str){byte [] decodeBytes = Base64.getDecoder().decode(str);return new String(decodeBytes);}//md5加密public static String encryptMD5(String str){try {// 创建MD5加密对象MessageDigest md = MessageDigest.getInstance("MD5");// 执行加密操作byte[] messageDigest = md.digest(str.getBytes());// 将字节数组转换为16进制字符串StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}// 返回加密后的字符串return hexString.toString();} catch (Exception e) {throw new RuntimeException(e);}}//生成加密认证,认证规则为:base64(app_code|时间戳|md5(secret+时间戳))public static String getAuth(String appCode,String secret,String timestamp){String secretContent = encryptMD5(secret+timestamp);String authStr = appCode+"|"+timestamp+"|"+secretContent;System.out.println(authStr);return base64Encode(authStr);}//auth检验,样例public static boolean checkAuth(String auth){String authStr = base64Decode(auth);String[] authArr = authStr.split("\\|");if(authArr.length!=3){return false;}String appCode = authArr[0];String timestamp = authArr[1];String secretContent = authArr[2];String secret = "123456"; //实际上这个secret是需要通过appCode去数据库查询得到,并且这里还要将请求出入参进行记录String secretContentNew = encryptMD5(secret+timestamp);if(!secretContent.equals(secretContentNew)){return false;}return true;}public static void main(String[] args){String auth = getAuth("app_code","app_secret","2024-09-10 11:11:00");System.out.println(auth);System.out.println(checkAuth(auth));}
关于接口认证校验,可以直接使用AOP切面,这个不再赘述了,相关参考代码非常多。
可优化点
① 根据app_code查询app_secret可以走缓存,应用启用的时候,将这些信息全部刷入redis,减少不必要的IO操作。
② 外部应用配置表可以新增一个IP地址的字段,用于配置调用方的IP白名单,如果开启IP白名单校验了,可以先校验请求方的IP是否在配置的白名单中,如果不在可以直接过滤掉。这种方式也可以实现防火墙的效果,但是对防火墙是松耦合的。
③ 时间戳的校验和失效,时间戳写入redis中,设置一个默认失效时间,不然请求过的时间戳随着时间推移会把redis打爆。这里的失效时间可以根据实际情况设计。另外,关于时间戳的校验可以再加一层校验,根据当前时间判断时间戳是否在指定浮动范围内,如果不在,哪怕时间戳没有在已请求过时间戳缓存中,也直接当做非法请求。 这就能避免过期时间戳重复使用的情况,这种优化浮动范围的设置比较关键,主要是要求调用方和后端主机的时钟基本同步,这个浮动范围就是时钟不同步的最大范围。
④ 将所有请求按照指定格式记录日志,可用于问题分析及调用量分析。
⑤ 根据业务需要可以加上一些限流策略,避免调用方无节制的调用。
相关文章:
基于http请求的一种安全校验认证方案记录
目录 需求简述 设计方案 参考代码 可优化点 需求简述 日常的开发对接过程中,经常会遇到需要给其他合作伙伴或者其他系统通过接口的方式提供数据,或者有些接口是需要提供通用能力出去的。 从安全的角度考虑,我们往往需要给接口加一些安全校…...
链动321模式开发系统解析源码
链动321模式是一种结合了区块链技术、动态激励机制与“321”运营模式的新型电商架构。该模式通过激励用户分享和推广,实现用户、企业和平台的共赢,具有独特的商业逻辑和高效的运营机制。以下是对链动321模式的详细解析: 系统特点 裂变迅速&am…...
TypeScript 快速上⼿ (3:装饰器)
目录 一、简介 二、类装饰器 基本语法 应用举例 关于返回值 关于构造类型 替换被装饰的类 三、装饰器工厂 四、装饰器组合 五、属性装饰器 基本语法 关于属性遮蔽 应用举例 六、方法装饰器 基本语法 应用举例 七、访问器装饰器 基本语法 应用举例 八、参数装…...
el-input设置后缀显示单位并阻止滚轮微调
项目中收集form表单信息时,有时会需要在el-input后面显示单位,效果如图: 当然,我们可以直接在输入框后面加上单位,但直接给输入框上加单位不管是视图上还是用户体验上看起来都要好一点 element-plus / element-ui给我…...
Redis Key的过期策略
Redis 的过期策略主要是指管理和删除那些设定了过期时间的键,以确保内存的有效使用和数据的及时清理。 具体来说,Redis 有三种主要的过期策略:定期删除(Scheduled Deletion)、惰性删除(Lazy Deletion&#…...
数据结构:时间复杂度与空间复杂度
目录 算法效率时间复杂度大O渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后,运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏,⼀般是从时间和空间两个维度来衡量的…...
C语言实现贪吃蛇小游戏
✅博客主页:爆打维c-CSDN博客 🐾 🔹分享c语言知识及代码 🐾 目录 游戏展示视频 一、项目准备工作 二、功能实现分析 1.游戏开始 a.设置本地化、创建窗口、标题 b.隐藏光标,封装定位光标的函数 c.打印欢迎界面及提示信息 …...
深入解析包裹信息管理系统:关系型数据库逻辑数据模型设计、超类实体与派生属性探讨
目录 案例 【题目】 【问题 1】(14分) 【问题 2】(6分) 【问题 3】(5分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 案例 阅读下列说明,回答问题 1 至问题 3。 【题目】 某企业委托软件公司开发包裹信息管理系统,以便于对该企业…...
Cyber Weekly #24
赛博新闻 1、OpenAI发布最强模型o1 本周四(9月12日),OpenAI宣布推出OpenAIo1系列模型,标志着AI推理能力的新高度。o1系列包括性能强大的o1以及经济高效的o1-mini,适用于不同复杂度的推理任务。新模型在科学、编码、数…...
Java多线程面试精讲:源于技术书籍的深度解读
写在前面 ⭐️在无数次的复习巩固中,我逐渐意识到一个问题:面对同样的面试题目,不同的资料来源往往给出了五花八门的解释,这不仅增加了学习的难度,还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…...
【Elasticsearch系列七】索引 crud
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
快速生成服务器响应json-server的安装和使用
json-server介绍地址:https://www.geeksforgeeks.org/json-server-setup-and-introduction/ 1.json-server是什么? 基于自定义的json文件,快速生成服务端响应,可用于前端调试接口 2.安装和卸载json-server 2.1 安装: 使用npm命令: npm install -g json-server 2.2 卸载 npm …...
增强LinkedList实现瑞士轮赛制编排
前言 LinkedList底层虽然是基于链表实现,但是由于其对底层节点进行了封装,导致无法操作底层Node对象。这也为使用上带来了很多不便,比如我之前遇到的一个需求:将n个队伍按照瑞士轮进行编排,组成n/2个队伍,…...
C++编译环境(IDE)推荐及安装
IDE是什么 嗨嗨嗨,我又来水博文了 今天来给大家推荐几款好用的IDE IDE是集成开发环境(Integrated Development Environment)的缩写,是一种软件应用程序,提供了用于软件开发的各种工具和功能,包括代码编辑…...
Android 12系统源码_窗口管理(八)WindowConfiguration的作用
前言 在Android系统中WindowConfiguration这个类用于管理与窗口相关的设置,该类存储了当前窗口的显示区域、屏幕的旋转方向、窗口模式等参数,应用程序通过该类提供的信息可以更好的适配不同的屏幕布局和窗口环境,以提高用户体验。 一、类定…...
已读论文创新点合集
系列文章目录 文章目录 系列文章目录一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》二、《MaPLe: Multi-modal Prompt Learning》三、《Learning to Prompt for Vision-Language Models》CoOp 一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》…...
12_持久化数据结构
菜鸟:老鸟,我在处理一个项目时遇到了问题。我需要频繁地修改和查询一个数据结构,但每次修改后我都得复制整个结构,性能实在是太低了。有没有什么办法可以高效地处理这种情况? 老鸟:你提到了一个很有意思的…...
【计算机网络】IP, 以太网, ARP, DNS
IP, 以太网, ARP, DNS IP协议回顾IP地址报文格式功能介绍地址管理IP地址数量问题初识 NAT 机制通信机制IP数量的解决方案网段划分特殊IP地址 路由选择 以太网协议报文格式源MAC/目的MACMAC地址是什么MAC地址格式MAC的作用 ARPDNS初识DNSDNS主要功能DNS的查询过程 IP协议 回顾I…...
OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.0) Install macOS on unsupported Macs 请访问原文链接:https://sysin.org/blog/install-macos-on-unsupported-mac/,查看最新版。原创作品,转载请保留出处。 作者主…...
爆改YOLOv8|使用MobileNetV4替换yolov8的Backbone
1,本文介绍 MobileNetV4 是最新的 MobileNet 系列模型,专为移动设备优化。它引入了通用反转瓶颈(UIB)和 Mobile MQA 注意力机制,提升了推理速度和效率。通过改进的神经网络架构搜索(NAS)和蒸馏…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
