假如现在要在 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#5、PKCS#7 填充、Zero 填充等。
  • 字符编码 (Character Encoding) :在对明文进行加密前,通常需要将其转换为字节流。这时需要指定字符编码,如 UTF-8、ASCII 等。
  • 密钥衍生 (Key Derivation) :有时候会使用密钥衍生函数(Key Derivation Function,KDF)从密码中派生出实际用于加密的密钥。

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

实现步骤

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

使用 CryptoJS 在 Apifox 中实现 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),或者等下直接在脚本中赋值。

使用 CryptoJS 在 Apifox 中实现 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 加密算法加密后的值。

使用 CryptoJS 在 Apifox 中实现 AES 加密的最佳实践

步骤 4

发送请求

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

使用 CryptoJS 在 Apifox 中实现 AES 加密的最佳实践

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

使用 CryptoJS 在 Apifox 中实现 AES 加密的最佳实践

附录

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

使用 CryptoJS 在 Apifox 中实现 AES 加密的最佳实践

fromfastapiimportFastAPI
frompydanticimportBaseModel
fromCrypto.CipherimportAES
importbase64
importuvicorn
app = FastAPI()
# 解密函数
defdecrypt_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")
 returnunpadded_password
classDecryptionRequest(BaseModel):
  username:str
  password:str
@app.post("/decrypt")
async defdecrypt_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)

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

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