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

2024-06-21 20:28

本文主要是介绍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 等都可以进行类似的操作和调用。

这篇关于Apifox 中如何处理加密或编码过的响应数据?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082245

相关文章

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2