You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMeter中用BeanShell预处理器生成签名?遇报错求助

在JMeter BeanShell中实现签名生成逻辑

错误原因

你遇到的cipher未定义错误,是因为BeanShell(基于Java的脚本环境)不存在JavaScript代码里的cipher对象,必须用Java标准加密库重新实现签名逻辑。

常见签名实现示例

由于你未说明createSignature的具体算法,以下以HMAC-SHA256签名(接口签名最常用的算法之一)为例给出实现,若原逻辑是RSA等其他算法,可替换对应代码段。

BeanShell代码实现

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;

// 从JMeter变量中读取已计算好的参数
String stringCipheredBody = vars.get("stringCipheredBody");
String randomKey = vars.get("randomKey");

// 签名算法,需与原JavaScript逻辑完全一致(如HmacSHA1、HmacSHA512)
String algorithm = "HmacSHA256";

try {
    // 初始化MAC签名实例
    Mac mac = Mac.getInstance(algorithm);
    SecretKeySpec secretKey = new SecretKeySpec(randomKey.getBytes("UTF-8"), algorithm);
    mac.init(secretKey);
    
    // 生成签名字节数组
    byte[] signatureBytes = mac.doFinal(stringCipheredBody.getBytes("UTF-8"));
    
    // 转十六进制字符串(若原JS用Base64,替换为Base64.encodeBase64String(signatureBytes))
    String signature = Hex.encodeHexString(signatureBytes);
    
    // 将签名存入JMeter变量,供请求头调用
    vars.put("x-signature", signature);
    log.info("生成签名成功:" + signature);
} catch (Exception e) {
    log.error("签名生成失败:" + e.getMessage(), e);
    throw e;
}

若原逻辑为RSA非对称签名

如果createSignature是基于RSA的私钥签名,替换为以下代码:

import java.security.Signature;
import java.security.PrivateKey;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import org.apache.commons.codec.binary.Base64;

// 读取Base64编码的PKCS8格式私钥(需替换为你的实际私钥)
String privateKeyStr = "你的RSA私钥Base64字符串";
byte[] privateKeyBytes = Base64.decodeBase64(privateKeyStr);

// 初始化私钥与签名实例
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(stringCipheredBody.getBytes("UTF-8"));

// 生成Base64格式签名
byte[] signatureBytes = signature.sign();
String signatureStr = Base64.encodeBase64String(signatureBytes);
vars.put("x-signature", signatureStr);

注意事项

  • 确保JMeter的lib目录下存在commons-codec.jar(JMeter默认自带,若缺失需手动添加)。
  • 必须保证算法、编码格式(UTF-8)、签名输出格式(十六进制/Base64)与原JavaScript逻辑完全一致,否则签名会校验失败。

内容的提问来源于stack exchange,提问作者Hans López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:25:04