JMeter录制脚本后请求体出现加密密码,CSV参数化失败
解决JMeter登录请求加密密码替换失败问题
问题本质
你的登录接口要求发送加密后的密码,而非明文。直接用CSV的明文密码替换请求体里的加密值,接口自然会校验失败。核心是要在JMeter中对明文密码做和前端一致的加密处理,再传入请求体。
步骤解决
1. 确定加密算法
从密码格式U2FsdGVkX1/...判断,这是OpenSSL AES加密的典型特征(前缀是Salted__的Base64编码),一般采用AES-128/256-CBC模式,带盐值加密。
2. 获取加密逻辑
- 查前端源码:打开浏览器F12→Sources,搜索
password、encrypt等关键词,找到登录时的加密JS代码,提取密钥、盐值、加密模式、填充方式。 - 抓包对比:手动输入明文密码,观察浏览器发送请求前的加密过程,或检查是否有前置接口返回加密所需的动态密钥/盐值。
3. 在JMeter中实现加密(推荐用JSR223组件)
用Groovy编写加密代码,效率远高于BeanShell。以下是OpenSSL AES加密的示例代码(替换实际的密钥、盐值):
import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec import org.apache.commons.codec.binary.Base64 import org.apache.commons.codec.digest.DigestUtils // 从CSV变量读取明文密码 def plainPwd = vars.get("csv_password") // 替换为实际的盐值(可能是固定值或从接口提取的动态值) def salt = "your_salt_value" // 替换为实际的加密密钥 def key = "your_encryption_key" // 生成OpenSSL风格的密钥和IV def keyBytes = DigestUtils.md5(key + salt) def ivBytes = DigestUtils.md5(keyBytes + key + salt) SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES") IvParameterSpec ivSpec = new IvParameterSpec(ivBytes) // 执行加密 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec) def encryptedBytes = cipher.doFinal(plainPwd.getBytes("UTF-8")) // 添加OpenSSL的Salted__前缀并转Base64 def saltedPrefix = "Salted__".getBytes() def combined = saltedPrefix + salt.getBytes() + encryptedBytes def encryptedPwd = Base64.encodeBase64String(combined) // 将加密后的密码存入变量,供请求体调用 vars.put("encrypted_password", encryptedPwd)
- 把这段代码放到JSR223 PreProcessor(添加在登录请求下),确保在请求发送前完成加密。
4. 修改请求体
将原请求体中的固定加密密码替换为变量:
{"program":"AuthService","data":{"email":"${csv_email}","password":"${encrypted_password}","apiContextCode":"petronas"}}
5. 验证
运行脚本,查看请求体是否生成正确的加密密码,检查接口响应是否返回登录成功状态。
注意事项
- 如果盐值是动态生成的(比如每次请求从前端或接口返回),需要先通过正则表达式/JSON提取器获取盐值,再传入加密代码。
- 确保JMeter的
lib目录下有commons-codec.jar(默认自带,若缺失需手动添加)。
内容的提问来源于stack exchange,提问作者vishakha bharambe
相关产品推荐
相关产品推荐

