Apifox 中通过 CryptoJS 给请求参数进行 AES 加密!图文教程

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密!图文教程

假如现在要在 Apifox 中发送一个“登录”的请求,然后我需要将接口中的password参数使用 AES 加密算法加密以后,再传给后台服务,这要怎么做?


要在 Apifox 中使用 AES 加密算法对password参数进行加密,你需要在【前置操作】中编写 JavaScript 代码,并使用 CryptoJS 库来实现 AES 加密,具体操作见下文。在开始之前,我们先了解一下什么是 AES 加密算法。


什么是 AES 加密算法?

AES(Advanced Encryption Standard)是一种对称加密算法,它使用相同的密钥进行加密和解密。在使用 AES 算法进行加密时,通常需要以下参数:

  • 密钥(Key): AES 算法使用的密钥长度可以是 128 位、192 位或 256 位(16/24/32字节)。密钥长度不同,安全性也不同。
  • 初始向量(Initialization Vector,IV): 初始向量是一个随机生成的固定长度的参数,用于增加加密的安全性,尤其是在对同一段明文进行多次加密时。IV 的长度通常为 128 位(16字节)。
  • 加密模式(Mode of Operation):AES 算法支持多种加密模式,例如 ECB、CBC、CTR、OFB、CFB 等。每种模式有不同的特点和适用场景,选择合适的加密模式对于实际应用至关重要。
  • 填充方式(Padding):在对明文进行加密时,如果明文的长度不是分组长度的整数倍,就需要对其进行填充。常用的填充方式有 PKCS#5PKCS#7 填充、Zero 填充等。
  • 字符编码(Character Encoding):在对明文进行加密前,通常需要将其转换为字节流。这时需要指定字符编码,如 UTF-8、ASCII 等。
  • 密钥衍生(Key Derivation):有时候会使用密钥衍生函数(Key Derivation Function,KDF)从密码中派生出实际用于加密的密钥。


这些参数的选择和配置需要根据具体的应用场景和安全需求来确定。特别注意,加密和解密过程需要相同的密钥和 IV 才能正确执行。

Apifox 中使用 AES 加密算法的步骤

首先在 Apifox 中打开你的“登录”接口,然后转到【修改文档->前置操作】标签页,新建一个“自定义脚本”,你就可以在这里编写你的加密脚本。注意这个“自定义脚本”需要在“变量替换&继承父级”之前,见下图:

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密


接下来,我们就可以使用 AES 加密算法来给接口的请求数据加密了。


步骤 1:引入 CryptoJS 库

CryptoJS 是一个流行的 JavaScript 库,用于提供加密算法的实现,例如 AES、DES、TripleDES、Rabbit、RC4、MD5、SHA-1、SHA-256 等。使用 CryptoJS,你可以在客户端或服务器端轻松地实现加密功能,以保护数据的安全性。


Apifox 中内置了 CryptoJS 库,所以你可以直接使用,引入方式为:

var cryptoJs = require("crypto-js");


步骤 2:编写 AES 加密脚本

假设你的密码字段名是password,你可以先将其存到环境变量中并给定值(比如:123456),或者等下直接在脚本中赋值。

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密


下面是一个使用 CryptoJS 进行 AES 加密的示例脚本,该脚本将加密后的密码存储到环境变量中,以便在后续的请求中使用。

// 导入 crypto-js 模块
var cryptoJs = require("crypto-js");

// 密码获取方式根据实际情况调整
// 假设这是我们要加密的`password`字段的值,从环境变量中获取
const password = pm.environment.get("password"); // 或其他方式获取,比如直接赋值

// 使用安全方式确定的密钥和IV(这里为了示例简化说明,实际应用中需要保护好这些敏感信息)
const key = cryptoJs.enc.Utf8.parse('mySecretKey12345'); // 确保是16/24/32字节
const iv = cryptoJs.enc.Utf8.parse('myIVmyIVmyIVmyIV'); // 确保是16字节

// AES加密
const encrypted = cryptoJs.AES.encrypt(password, key, {
    iv: iv,
    mode: cryptoJs.mode.CBC,
    padding: cryptoJs.pad.Pkcs7
}).toString();

// 把加密后的密码设置为一个新的变量,可以在请求体内使用
pm.environment.set("encryptedPassword", encrypted);

上面的脚本具体解释如下:

  1. 导入 crypto-js 模块。
  2. 使用环境变量或其他方式获取要加密的密码(在这里假设密码从环境变量中获取)。
  3. 定义了一个密钥 key 和一个初始化向量 iv。密钥和初始化向量是用来加密和解密数据时的重要参数,在实际应用中,应该保护好这些敏感信息。
  4. 使用 crypto-js 中的 AES 加密函数 cryptoJs.AES.encrypt() 对密码进行加密。其中,传入的参数包括原始密码(password)、密钥(key)、初始化向量(iv)以及加密模式(mode)和填充方式(padding)。在 CryptoJS 中,使用 cryptoJs.pad.Pkcs7 来指定使用 PKCS#7 填充方式。
  5. 将加密后的密码存储到一个新的环境变量中,以便在后续的请求中使用。

在【前置操作】中编写的加密脚本会在发起请求之前自动执行,下面就来发起一个请求,看看这个password字段是否被加密并发送到后台服务了。

步骤 3:在请求体中使用加密后的密码

在请求体(假设你的请求体是 JSON 格式)中,使用加密后的密码代替原始密码:

{
  "username": "zhangsan",
  "password": "{{encryptedPassword}}"
}

这里的{{encryptedPassword}}是 Apifox 的变量语法,它会被替换为【前置操作】中设置的环境变量encryptedPassword的值,也就是通过 AES 加密算法加密后的值。

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密


步骤 4:发送请求

点击“发送”按钮,查看返回响应。我这里为了测试数据,所以让后台把接口传过来的参数解密后返回了,可以看到后台解密后的password字段值与上面“第二步”的环境变量中定义的值一样。

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密


来到“实际请求”那里查看,可以看到接口发送的password字段是加密传参的,说明 AES 加密脚本生效。

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密

总结

Apifox 中使用 AES 加密算法对密码参数进行加密的基本步骤如下:

  1. 在前置操作中编写 JavaScript 代码,使用 CryptoJS 库实现 AES 加密。
  2. 引入 CryptoJS 库并编写 AES 加密脚本,定义密钥和初始化向量,并对密码进行加密。
  3. 将加密后的密码存储到环境变量中,以便在后续请求中使用。
  4. 在请求体中使用加密后的密码。
  5. 发送请求并查看响应,确认密码字段已加密传参。

附录

下面的代码是用 FastAPI 写的一段简单的 AES 解密脚本,有兴趣可以建个.py文件运行一下,对应的http://127.0.0.1:8000/decrypt就是上文例子的请求接口。运行前记得安装相关的模块,如pip install pycryptodome等,也可以根据控制台的报错来安装,缺什么就装什么。

Apifox 中通过 CryptoJS 给请求参数进行 AES 加密
from fastapi import FastAPI
from pydantic import BaseModel
from Crypto.Cipher import AES
import base64
import uvicorn

app = FastAPI()

# 解密函数
def decrypt_password(password: str, key: bytes, iv: bytes) -> str:
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_bytes = cipher.decrypt(base64.b64decode(password))
    # 去除填充
    unpadded_password = decrypted_bytes[:-decrypted_bytes[-1]].decode("utf-8")
    return unpadded_password

class DecryptionRequest(BaseModel):
    username: str
    password: str

@app.post("/decrypt")
async def decrypt_password_endpoint(request: DecryptionRequest):
    # 在这里设定你的密钥和初始向量
    key = b'mySecretKey12345'
    iv = b'myIVmyIVmyIVmyIV'
    password = request.password
    decrypted_password = decrypt_password(password, key, iv)
    return {"username": request.username, "password": decrypted_password}

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)
订阅
qrcode

订阅

随时随地获取 Apifox 最新动态