使用 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. 发送请求并查看响应,确认密码字段已加密传参。
相关推荐
m0_7482550222 分钟前
前端常用算法集合
前端·算法
真的很上进36 分钟前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web1309332039842 分钟前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_2341 小时前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
如若1232 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
追逐时光者2 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~2 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581362 小时前
InnoDB 的页分裂和页合并
数据库·后端
滚雪球~2 小时前
npm error code ETIMEDOUT
前端·npm·node.js