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

news2024/10/6 23:37:16

接口返回的响应数据有时是经过编码或加密处理的,要转换成可读的明文,可以使用 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.coloradmin.cn/o/1846959.html

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

相关文章

【开源项目】智慧北京案例~超经典实景三维数字孪生智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!

飞渡科技数字孪生北京管理平台, 依托实景数字孪生底座,以城市感知网络为硬件基础,以城市大数据为核心资源,以数字孪生、云计算、人工智能为关键技术,实现城市产业规划、资产安全管理、城市能耗监控等一体化空间融合。 …

我国光伏连接器市场规模逐渐扩大 国产化率不断提升

我国光伏连接器市场规模逐渐扩大 国产化率不断提升 光伏连接器是在光伏系统中用于连接控制器、汇流箱、逆变器等各组件的设备。光伏连接器是光伏系统的“生命线”,可确保有效的能量传输,并尽量减少系统中的任何功率损失。光伏连接器具有防水、防尘、电压…

The First项目报告:解读互链操作协议LayerZero

随着 DeFi 项目的兴起,跨链互操作性成为区块链领域的热门话题,在众多的跨链平台中,Layer Zero 凭借其创新技术和设计备受关注,近期Layer Zero发布代币空投方案,引发社区热议,随着其代币上线The First平台&a…

Vue69-路由基本使用

一、需求 二、开发步骤 2-1、路由的安装 vue-router3才能在vue2中使用!现在默认是vue-router4版本,要在vue3中使用!所以,安装的时候要指定版本。 2-2、在main.js中引入和使用路由 2-3、创建router文件夹 一般在vue中用了vue-ro…

SpringBoot引入外部依赖包

将需要引入的文件放置到与src同级别的目录下 如上&#xff0c;在src的同级&#xff0c;新建了一个lib目录&#xff0c;将jar包放置其中 在POM文件下&#xff0c;加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…

电脑蓝屏修复|你的设备遇到问题,需要重启。我们只收集某些错误信息,然后为你重新启动。100% 完成 终止代码: 0xc000021a

问题描述 今天莫名其妙电脑打不开了&#xff0c;一直如上图所示蓝屏&#xff0c;重启也不行 问了某电脑店的客服&#xff0c;说修复需要50元&#xff0c;真黑啊&#xff0c;果断自己搜方法&#xff0c;怒省50大洋hh 修复方法 重启电脑三次&#xff0c;第三次触发电脑的自动修…

ShuffleNet系列论文阅读笔记(ShuffleNetV1和ShuffleNetV2)

目录 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices摘要Approach—方法Channel Shuffle for Group Convolutions—用于分组卷积的通道重排ShuffleNet Unit—ShuffleNet单元Network Architecture—网络体系结构 总结 ShuffleNet V2: Pra…

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…

一个很好用的地图工具的使用:思极地图,以及vue+思极地图的使用

前言&#xff1a; 随着现在国网等一部分公司的需求&#xff0c;在线地图-思极地图 出现在我们眼前&#xff0c;给我们带来了很多便利&#xff0c;这里分享下他的信息与使用。 实现效果&#xff1a; 相关资料&#xff1a; 1、官网地址 2、在线地址 3、官方api地址 实现步骤-js…

Nvidia Isaac Sim组装机器人和添加传感器 入门教程 2024(5)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

椭圆的几何要素

椭圆的几何要素 flyfish 椭圆的方程为 x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1。 长半轴 a a a&#xff08;绿色虚线&#xff09;和短半轴 b b b&#xff08;紫色虚线&#xff09;。 焦点 F 1 ( − c , 0 ) F1(-c, 0) F1(−c,0)&#…

【C语言】解决C语言报错:Segmentation Fault

文章目录 简介什么是Segmentation FaultSegmentation Fault的常见原因如何检测和调试Segmentation Fault解决Segmentation Fault的最佳实践详细实例解析示例1&#xff1a;未初始化指针示例2&#xff1a;数组越界示例3&#xff1a;使用已释放的内存示例4&#xff1a;递归导致栈溢…

vscode安装所需插件 个人记录版

vscode安装所需插件 个人记录版 仅做参考 设置

LangChain入门学习笔记(六)—— Model I/O之Output Parsers

当大模型产生输出返回后&#xff0c;它的内容更像是一段平铺的文字没有结构。在传给下游节点处理时可能并不能符合输入要求&#xff0c;LangChain提供了一套机制使得模型返回的内容可以按照开发者定义的那样结构化。 在官网文档中可以看到LangChain提供了丰富的输出解析器&…

Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选

Solana Sol跟单机器人&#x1f916; SOL跟单机器人&#xff08;Copy Trading Bot&#xff09;是一种自动化交易工具&#xff0c;允许用户复制其他成功交易者的交易行为。这种机器人通常用于加密货币市场、外汇市场等金融市场。以下是SOL跟单机器人的一些关键特性和功能&#xf…

优维“态势感知监控”产品:像“上帝”一样掌控应用系统

什么是态势感知&#xff1f; 态势感知是一种基于环境的、动态、整体地洞悉全网安全风险的能力。它以安全大数据为基础&#xff0c;从全局视角对全网安全威胁进行发现识别、理解分析展示和响应处置&#xff0c;并预测发展趋势&#xff0c;为后续网络安全的相关决策与行动提供数据…

重学java 81.类的加载时机

不破不立&#xff0c;人类最宝贝的品质就是勇敢和过去告别 —— 24.6.21 一、类的加载时机 1.new对象 2.new子类对象(new子类对象先初始化父类) 3.执行main方法 4.调用静态成员 5.反射,创建Class对象 这五种情况就可以让类加载到内存 类加载过程 1.问题:谁将class文件加载到了…

爬虫逆向实战(41)-某花顺登陆(Cookie、MD5、SHA256)

一、数据接口分析 主页地址&#xff1a;某花顺 1、抓包 通过抓包可以发现在登陆时&#xff0c;网站首先请求了pwdRangeCalcRegular.json、getGS两个接口&#xff0c;接着请求dologinreturnjson2进行登陆&#xff0c;但是此接口会返回请先完成滑块验证码校验的响应。然后网站…

U盘容量变0字节:详解原因、恢复方案与预防措施

一、U盘容量变0字节的现象 在日常工作和学习中&#xff0c;U盘作为一种便携式存储设备&#xff0c;被广泛用于数据交换和存储。然而&#xff0c;有时我们可能会遇到一种奇怪的现象&#xff1a;原本容量正常的U盘&#xff0c;在插入电脑后突然显示容量为0字节。这种情况意味着我…