在 JMeter 中测试加密且数据变动的报文,核心是先解决 “动态数据参数化”,再通过 “自定义加密逻辑” 处理报文,最后组装请求。具体步骤如下:
一、第一步:解决 “数据变动”—— 参数化动态数据
先通过 JMeter 的参数化组件,生成 / 获取每次请求的动态数据(如时间戳、随机数、用户 ID 等),避免硬编码。常用参数化方式:
场景 | 推荐组件 / 工具 | 说明 |
---|---|---|
固定格式的动态值 | 函数助手(Functions Helper) | 如${__time(yyyyMMddHHmmss,)} (时间戳)、${__Random(1000,9999,)} (随机数) |
批量预设的动态值 | CSV Data Set Config(CSV 数据文件) | 从 CSV 文件中逐行读取动态数据(如不同用户账号、订单号) |
自定义逻辑生成的值 | User Defined Variables(用户定义变量) | 手动定义全局动态变量,或结合脚本生成 |
二、第二步:解决 “报文加密”—— 添加加密逻辑
JMeter 无内置加密组件,需通过预处理程序编写加密脚本,将 “参数化后的动态数据” 加密为密文,再传入请求报文。推荐两种方式:
方式 1:JSR223 预处理程序(推荐)
性能优于 BeanShell,支持 Groovy/Java 脚本,可直接编写加密逻辑或调用外部加密 jar 包。
核心步骤:
- 在 “HTTP 请求” 下添加 “JSR223 预处理程序”。
- 选择脚本语言(如
Groovy
)。 - 编写脚本:
- 第一步:获取参数化的动态明文(如
def plainText = vars.get("dynamicParam");
,dynamicParam
是第一步定义的参数化变量)。 - 第二步:调用加密算法(如 AES、RSA)处理明文,生成密文。
- 第三步:将密文存入 JMeter 变量(如
vars.put("encryptedText", cipherText);
),供请求报文引用。
- 第一步:获取参数化的动态明文(如
示例(AES 加密片段):
groovy
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
// 1. 获取动态明文(第一步参数化的变量)
def plainText = vars.get("dynamicParam");
// 2. 加密配置(需与开发确认:密钥、算法、模式、填充方式)
String key = "1234567890abcdef"; // 实际密钥需从配置文件或变量读取
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 3. 执行加密并转Base64(避免乱码)
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
def encryptedText = Base64.encodeBase64String(encryptedBytes);
// 4. 存入变量,供请求使用
vars.put("encryptedText", encryptedText);
方式 2:BeanShell 预处理程序(兼容旧版本)
逻辑与 JSR223 一致,但性能较差,适合简单加密场景。脚本语法与 Java 类似,需注意:
- 引用外部 jar 包时,需将 jar 放入 JMeter 的
lib/ext
目录,并重启 JMeter。 - 变量操作同样使用
vars.get("变量名")
(获取)和vars.put("变量名", 值)
(存储)。
三、第三步:组装加密请求报文
在 “HTTP 请求” 的 “请求体”(如 JSON)中,通过${变量名}
引用第二步生成的加密变量,替换原明文位置。
示例(JSON 请求体):json
{
"requestId": "${__time(yyyyMMddHHmmss,)}", // 动态参数(第一步)
"encryptedData": "${encryptedText}", // 加密后的密文(第二步)
"timestamp": "${__time(,)}"
}
四、关键验证:解密响应(可选)
若需验证响应是否正确,可在 “HTTP 请求” 后添加JSR223 后置处理程序,编写解密脚本,将加密响应解密后与预期结果对比(如通过 “响应断言” 验证)。
五、注意事项
-
加密算法一致性:必须与开发确认加密细节(算法类型、密钥、IV 向量、编码方式(UTF-8/GBK)、填充模式),否则加密结果无效。
-
性能优化:若并发量高,优先使用
JSR223 + Groovy
(Groovy 是 JMeter 推荐的高性能脚本语言),避免 BeanShell。 -
密钥安全:不要将密钥硬编码到脚本中,可通过 “User Defined Variables” 或外部配置文件(如
user.properties
)读取,敏感场景可结合 JMeter 的 “加密变量” 插件。