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

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

实现步骤

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

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

步骤 1

引入 CryptoJS 库

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

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

ini 复制代码
var CryptoJS = require("crypto-js");

步骤 2

编写 AES 加密脚本

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

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

ini 复制代码
// 导入 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 格式)中,使用加密后的密码代替原始密码:

json 复制代码
{  "username": "zhangsan",  "password": "{{encryptedPassword}}"}

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

步骤 4

发送请求

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

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

💡 附录

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

python 复制代码
from fastapi import FastAPI

from pydantic import BaseModel

from Crypto.Cipher import AES

import base64

import uvicorn

  


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")

  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)

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

  1. 在前置操作中编写 JavaScript 代码,使用 CryptoJS 库实现 AES 加密。
  2. 引入 CryptoJS 库并编写 AES 加密脚本,定义密钥和初始化向量,并对密码进行加密。
  3. 将加密后的密码存储到环境变量中,以便在后续请求中使用。
  4. 在请求体中使用加密后的密码。
  5. 发送请求并查看响应,确认密码字段已加密传参。
相关推荐
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
黄尚圈圈3 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水4 小时前
简洁之道 - React Hook Form
前端
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
正小安6 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没7 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光7 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js