当前位置: 首页 > news >正文

基于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渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后,运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏,⼀般是从时间和空间两个维度来衡量的&#xf…...

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)和蒸馏…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

今日科技热点速览

🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...