Apifox 中如何处理加密或编码过的响应数据?

接口返回的响应数据有时是经过编码或加密处理的,要转换成可读的明文,可以使用 Apifox 内置的 JS 类库、或者通过调用外部编程语言 (如 Python、JavaScript 等) 来进行处理。

例如,一个经过 Base64 编码的数据可以通过内置类库进行解码,转换成可读的明文:

图片

下面就来分享一些常见的解码、解密例子。

解码响应数据

1、Base64 解码

当接口返回的数据经过 Base64 编码时,可以通过 CryptoJS 库进行解码,Apifox 中内置了该类库,因此可以直接在脚本中引入并使用。

比如接口返回的 Base64 编码数据为:

{    "data": "5L2g5aW977yMQXBpZm94IQ=="}

使用 CryptoJS 库来解码这个 Base64 编码的字符串,其示例脚本如下:

// 引入 CryptoJS 库const CryptoJS = require("crypto-js");// Base64 编码的字符串(一般从响应数据中提取)let encodedData = {"data": "5L2g5aW977yMQXBpZm94IQ=="}// 解码 Base64 编码的数据let decodedData = CryptoJS.enc.Base64.parse(encodedData.data).toString(CryptoJS.enc.Utf8);// 输出解码后的结果console.log(decodedData); // "你好,Apifox!"

在 Apifox 中,你可以在「后置操作」中添加一个自定义脚本,将上述解码逻辑编写其中。当接口发送请求后,可在响应面板的「控制台」中查看解码后的数据。

图片

此外,解码后的数据也可以存储到环境变量中,以供后续使用。例如:

pm.environment.set("decodedData",decodedData);

如果接口返回的 JSON 数据是以 Base64 编码形式出现的,可以同样使用 CryptoJS 库进行解码,并通过 pm.response.setBody() 方法将解码后的 JSON 数据设置为响应 Body。

比如下面返回的是一个经过 Base64 编码后的 JSON 响应:

图片

要将其解码,并将解码的 JSON 数据显示在响应 Body 中,示例脚本如下:

// 引入 CryptoJS 库const CryptoJS = require("crypto-js");// Base64 编码的字符串(从返回的响应数据中获取)let encodedData = pm.response.text();// 解码 Base64 编码的数据let decodedData = CryptoJS.enc.Base64.parse(encodedData).toString(CryptoJS.enc.Utf8);// 解析解码后的 JSON 字符串let jsonData = JSON.parse(decodedData);// 将解析后的 JSON 数据设置为响应体pm.response.setBody(jsonData);

图片

2、URLEncode 解码

当接口返回的数据经过 URLEncode 编码时,可以使用 JavaScript 内置的 decodeURIComponent() 方法进行解码。

例如,一个接口返回的数据是经过 URLEncode 编码的 JSON 字符串,这个字符串包含了几个键值对,其中值是被 URLEncode 编码的。

{"name": "%E5%BC%A0%E4%B8%89","email": "qxhswppn%40gmail.com"}

我们可以使用 decodeURIComponent() 方法来解码这个 JSON 字符串中的编码值,将它们转换为正常的字符串。示例脚本如下:

// 假设这是从接口返回的编码后的 JSON 数据(一般从响应数据中获取)let response = {"name": "%E5%BC%A0%E4%B8%89","email": "qxhswppn%40gmail.com"};// 使用 decodeURIComponent 进行解码let decodedName = decodeURIComponent(response.name);let decodedEmail = decodeURIComponent(response.email);console.log(decodedName); // "张三"console.log(decodedEmail); // "qxhswppn@gmail.com"

图片

解密 响应数据

1、AES 解密

要解密 AES 加密的密文,需要提供相应的密钥或初始向量 (IV) 。AES 使用对称加密算法,这意味着同一个密钥用于加密和解密,如果没有正确的密钥或者 IV,就无法解密密文。

假设有一个经过 AES 加密的密文,其加密模式为 ECB,填充模式为 Pkcs7。要在 Apifox 中解密该密文,可以使用内置的 CryptoJS 库进行解密。其 AES 解密脚本示例如下:

// 引入 CryptoJS 库const CryptoJS = require('crypto-js');// 经过 Base64 编码的 AES 加密后的密文(一般从响应数据中提取)const ciphertext = "Gig+YJFu4fLrrexzam/vblRV3hoT25hPZn0HoNoosHQ=";// 解密所需密钥,确保是 16/24/32 字节(一般从环境变量中读取)const key = CryptoJS.enc.Utf8.parse('1234567891234567');// AES 解密const decryptedBytes = CryptoJS.AES.decrypt(ciphertext, key, {mode: CryptoJS.mode.ECB, // 解密模式padding: CryptoJS.pad.Pkcs7 // 填充方式});// 将解密后的字节数组转换为 UTF-8 字符串const originalText = decryptedBytes.toString(CryptoJS.enc.Utf8);// 输出解密后的文本console.log(originalText); // "你好,Apifox!"

解密后的数据可在响应控制台中查看:

图片

2、RSA 解密

要解密 RSA 加密的密文,需要提供相应的 RSA 私钥,因为 RSA 是一种非对称加密算法,密钥对包含公钥和私钥,没有私钥无法解密密文  仅针对 RSA 公钥加密,私钥解密的场景) 。

Apifox 内置了 jsrsasign 库 (10.3.0 版本) ,可以利用该库来解密 RSA 密文,示例如下:

// 引入 jsrsasign 库const jsrsasign = require('jsrsasign');// 定义私钥(一般从环境变量中读取)const privateKeyPEM = `-----BEGIN PRIVATE KEY-----私钥……-----END PRIVATE KEY-----`;// 定义密文(一般从响应数据中提取)const ciphertext = '';// 解密const prvKeyObj = jsrsasign.KEYUTIL.getKey(privateKeyPEM);const decrypted = jsrsasign.KJUR.crypto.Cipher.decrypt(ciphertext, prvKeyObj);console.log(decrypted);

图片

一个简单的 RSA 加密解密的完整示例参考 (注意 jsrsasign 版本为 10.3.0,其它版本语法可能会不兼容) ,你可以将其在 Node.js 环境下运行,并根据需要在 Apifox 中执行加密或解密的操作:

const rsa = require('jsrsasign');// 生成 RSA 密钥对const keypair = rsa.KEYUTIL.generateKeypair("RSA", 2048);const publicKey = rsa.KEYUTIL.getPEM(keypair.pubKeyObj);const privateKey = rsa.KEYUTIL.getPEM(keypair.prvKeyObj, "PKCS8PRV");console.log("公钥:", publicKey);console.log("私钥:", privateKey);// 用公钥加密const plaintext = "你好,Apifox!";const pubKeyObj = rsa.KEYUTIL.getKey(publicKey);const encryptedHex = rsa.KJUR.crypto.Cipher.encrypt(plaintext, pubKeyObj);console.log("加密密钥:", encryptedHex);// 用私钥解密const prvKeyObj = rsa.KEYUTIL.getKey(privateKey);const decrypted = rsa.KJUR.crypto.Cipher.decrypt(encryptedHex, prvKeyObj);console.log("解密明文:", decrypted);

图片

3、调用外部程序进行解密

除了使用 Apifox 内置的 JS 类库进行解密,还可以通过调用「外部程序」来完成解密。

有关「外部程序」的使用,你可以参考这篇文章:《如何在 Apifox 中调用其他语言(Java、PHP、Python、Go 等)》,或者访问 Apifox 的帮助文档,里面有更详细的介绍。

外部程序是保存在「外部程序目录」下的代码文件,这些文件可以是 Java 程序归档文件 .jar 包,也可以是其他编程语言的代码源文件,例如 .py、.php、.js 等后缀的文件。文件需要放到「外部程序目录」下,这个目录可以在页面右上角的「设置->外部程序」中打开。

图片

举个例子!

例如要通过 Node.js 的 node-forge 库来进行 RSA 解密,这时候就可以在「外部程序目录」中创建一个 .js 文件来编写解密逻辑,然后在 Apifox 的「后置操作」中调用这个 .js 文件,以获取解密后的明文。具体操作如下:

创建解密脚本

首先创建一个 .js 文件,在文件中编写解密逻辑,因为要用到 node-forge 库,所以还需要在该目录下使用 npm 或 yarn 安装该库,并在 .js 解密文件中引入。其它编程语言也是类似的,需要引入什么库就在本地进行安装,确保程序能够在本地运行无误即可。

图片

接下来,在 .js 文件中编写解密逻辑,示例代码如下:

// 引入 node-forge 库const forge = require('node-forge');// 获取命令行参数const args = process.argv.slice(2);// 私钥(PEM 格式)const privateKeyPem = `-----BEGIN RSA PRIVATE KEY-----私钥……-----END RSA PRIVATE KEY-----`;// 加密密文,从命令行获取const encrypted = args[0];// 将 PEM 格式的私钥转换为 forge 的私钥对象const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);// 将 Base64 编码的加密数据转换为字节数组const encryptedBytes = forge.util.decode64(encrypted);// 解密数据const decrypted = privateKey.decrypt(encryptedBytes, 'RSA-OAEP');// console.log() 输出的内容会被 Apifox 捕获console.log(decrypted);

这个脚本的逻辑是:

  • 从命令行参数获取加密的密文,该密文在 Apifox 中以命令行的方式传过来 (JavaScript 中通过process.argv获取命令行参数,其它编程语言需要根据对应的语法来获取)
  • 使用 PEM 格式的私钥进行解密。
  • 将解密后的明文通过 console.log() 输出,供 Apifox 捕获并返回。

在 Apifox 中调用外部程序

编写完解密脚本后,可以在 Apifox 的「后置操作」中使用 pm.executeAsync() 方法来调用该「外部程序」。注意需确保将解密脚本放在正确的外部程序目录中,并且在 Apifox 中调用该解密脚本时,引用的路径是相对于该目录的。在 Apifox 调用「外部程序」的示例代码如下:

// 加密密文(一般从返回的响应数据中获取)const encrypted = 'iDqUyR3BpaTqpzq…………'// 外部程序路径,传递参数const result = await pm.executeAsync('./nodejs-rsa/rsa.js', [`${encrypted}`])console.log('Result:', result);

当接口发送请求后,Apifox 会自动将密文传递给定义好的外部程序,执行解密操作,并捕获外部程序通过 console.log() 输出的结果,最终返回解密后的明文,如下图所示:

图片

这种解密方式不仅限于 Node.js,其他编程语言如 Java、PHP、Python、Go 等都可以进行类似的操作和调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可视化数据科学平台在信贷领域应用系列六:自动机器学习(上篇)

在现代数据驱动的世界中,机器学习已经成为解决复杂问题和推动创新的重要手段。然而,传统的机器学习模型开发过程复杂且耗时,包括数据预处理、特征工程、模型选择、参数调优和模型评估等多个步骤环节,需要模型开发人员具备丰富的专…

Java面试题:mysql执行速度慢的原因和优化

Sql语句执行速度慢 原因 聚合查询 多表查询 表数据量过大查询 深度分页查询 分析 sql的执行计划 可以使用EXPLAIN或者DESC获取Mysql如何执行SELECT语句的信息 直接在select语句前加关键字explain/desc 得到一个执行信息表 信息字段分析 possible_keys:可能使用到的索…

busybox的基本使用记录壹

内核如何启动init进程 init/main.c static int __ref kernel_init(void *unused) {int ret;kernel_init_freeable();/* need to finish all async __init code before freeing the memory */async_synchronize_full();ftrace_free_init_mem();jump_label_invalidate_initmem()…

JMeter的基本概念

一、主流测试工具 1,Loadrunner HP Loadrunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈 支持多协议:Web(HTTP/HTML)、Windows…

Java项目:基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城【ssm+B/S架构+源码+数据库+答辩PPT+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能…

通信系统概述

1.定义 通信系统(也称为通信网络)是利用各种通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,依靠网络软件及通信协议实现资源共享和信息传递的系统。 2.概述 随着通信技术和网络技术的不断发展&#xff…

Ubuntu系统如何配置通过图形界面登录root用户

Ubuntu系统中的root账号默认是锁定的,但可以通过设置密码来启用。 需要注意的是,由于root用户具有对系统完全控制的权限,因此在使用root账户时应格外小心。一个错误的命令可能会导致系统损坏,这就是为什么Ubuntu默认不启用root账户…

微服务开发与实战Day08 - Elasticsearch

一、初始Elasticsearch 高性能分布式搜索引擎 1. 认识和安装 1.1 认识 Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:Apache Lucene - Welcome to Apache Lucene Lucene的优势&…

集合:泛型深入

一.泛型的好处 1.统一了数据类型 2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。 二.泛型的细节 1.泛型中不能写基本数据类型 2.指定泛型的具体类型后,传递数据时,可以传入该类类型或者该类的子类类型 3.如果不…

Vue67-Vuex简介

因为vuex是插件,所以,使用的时候:vue.use(插件名) 一、Vuex的意义和使用场景 红色的箭头,都是读数据。 若是,B、C、D都想修改A组件中的x数据(写):此时,A组件就是数据的接…

人声分离的5个方法分享,从入门到精通,伴奏提取手拿把捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来,使得用户可以单独处理或重混音频,创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具,这一过程往往会比较困难。…

实用至上:智能体/Agent 是什么

Agent 的起源 不做词义追源,仅从大众角度,这个事儿是去年初开始的,也就是 2023 年 2-3 月。标志性事件包括: AutoGPT 等开源项目的发布,这是第一批基于自然语言的 AI 自动化实践:你告诉它一个任务&#xf…

Vscode远程ubuntu

远程连接 到这里vscode远程到ubuntu和关闭远程连接,已完成 配置python环境 在远程目录下新建.vscode隐藏文件夹,文件夹里新建一个 settings.json 文件, 先远程服务器看下conda下的python虚拟环境位置 settings.json位置及内容如下 测试pyt…

M12单端I/O预铸法兰插座A-code

M12单端I/O预铸法兰插座A-code概述 M12单端I/O预铸连接器A-code是一种常用于工业自动化领域的连接器件,主要用于传感器和执行器之间的信号传输。它的设计遵循国际标准IEC 61076-2-101,具有良好的防水防尘性能,通常达到IP67的保护等级。M12连…

2748. 美丽下标对的数目(Rust暴力枚举)

题目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length &#xff0c;如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 &#xff0c;则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总…

Linux 之内存管理 -free 和 RSS/RES的意义

一、free -h 计算关系&#xff1a; available free buff/cache total used availbleshared 参数 说明 total 总计物理内存的大小 used 已使用的物理内存的大小 free 可用物理内存有多少 shared 多个进程共享的内存总额 buff/cache 写入和读取 磁盘内存缓冲区的大小 avail…

基于llama3-8B-instruct的调用部署以及lora微调

基于llama3-8B-instruct的调用部署以及lora微调 1 Llama-3-8B-Instruct 基于FastApi 部署调用2 LLaMA3-8B-Instruct langchain 接入3 LaMA3-8B-Instruct 基于streamlit的web demo部署LLaMA3-8B-Instruct Lora 微调参考&#xff1a; 1 Llama-3-8B-Instruct 基于FastApi 部署调用…

Echarts饼图-实现今日进度-动态图

效果预览 本次实现的是一个饼图&#xff0c;蓝色科技背景色&#xff0c;星球转动效果 进度显示。 构建一个动态饼图&#xff0c;采用ECharts&#xff0c;背景为蓝色科技风&#xff0c;有星球转动效果。通过echarts.init初始化&#xff0c;设置图表尺寸和背景色&#xff0c;配…

疯狂刷题python版 | 使用PySide6自制刷题软件【源码+解析】

疯狂刷题python版 | 使用PySide6自制刷题软件【源码解析】 一、前言二、思考三、软件设计四、软件实现&#xff08;一&#xff09;使用QWebEngineView控件通过JavaScript代码和chrome内核进行数据交互和逻辑控制&#xff08;二&#xff09;用户分别通过浏览器 GUI和PySide6 GUI…

PostgreSQL中 FETCH FIRST ... WITH TIES 是查询结果中限制返回的行数

在 PostgreSQL 中&#xff0c;FETCH FIRST … WITH TIES 是一个在查询结果中限制返回的行数&#xff0c;但同时确保与最后一行具有相同排序值的所有行都被包括进来的子句。这通常与 ORDER BY 子句一起使用。 当您使用 FETCH FIRST n ROWS ONLY 时&#xff0c;您只会得到前 n 个…