jmeter JSR223 preprocessor javascript 接口信息加密

在进行接口测试或压测时,有时候需要对接口内容进行加密处理,否则服务器会直接拒绝请求。以下通过jmeter引入cryptoJS包的方式来实现接口参数信息的加密。

先下载javascript cryptoJS 包,将文件拷贝到jmeterbin目录中。

 jmeter 前置处理器中添加JSR223 preProcessor,如:jmeter-> pre processor -> JSR223 preprocessor,选择语言:javascript。

 通过load(uri);加载cryptoJS的文件,当前初始路径为jmeterbin目录。

定义引入的cryptoJS 变量。需要注意的是虽然JSR 223执行javascript语言,但是也不是全支持javascript语言。如定义变量关键字不支持:constlet之类的。因此定义变量尽可能用var 关键字。

定义好cryptoJS变量后,可根据实际接口的加密方式,进行相关脚本的设计。

以下是jmeter javascripthmac256加密代码示例及说明仅供参考:

load("./crypto-js/crypto-js.js");

// 定义引入的cryptoJS变量
var CryptoJS = CryptoJS;
var timestamp=getTimestamp();
var randomNum = getRandomInt(1,10);
var nonce = getMD5();
log.info(timestamp);
log.info(randomNum);

// 生成时间戳且截取保留10位长度
function getTimestamp(){
    var timestamp = (Date.now()/1000).toString().substring(0,10);
    return timestamp;
    }

//生成15位0-9的随机数
function getRandomInt(min,max){
    min = Math.ceil(min);
    max = Math.floor(max);
    nodeNum = "";
    for(var i=1;i<=15;i++){
        nodeNum+=Math.floor(Math.random()*(max-min+1))+min;
        }
    return nodeNum;
    }
//通过md5加密时间戳和随机数
function getMD5(){
    message = timestamp+getRandomInt
    md5Hash=CryptoJS.MD5(message).toString();
    return md5Hash;
    }

//Hmac256的加密方法
function cryptoHmac(data,key){
    return CryptoJS.HmacSHA256(data,key).toString();
    }

var method = sampler.getMethod();  //获取当前的请求方法
var path = sampler.getPath();          //获取当前请求的path路径信息
var find_char1 = path.indexOf("?");  //确认path路径中是否存在参数
var find_char2 = path.indexOf("="); // 确认path路径中是否存在参数
var body_obj = sampler.getArguments();  //获取当前请求参数的对象值
var params_num = body_obj.getArgumentCount();  // 获取当前请求的参数数量
var body_params = "";

log.info(params_num);
//通过请求方法和path路径找到参数值
if(method.toUpperCase() == "GET" && find_char1>0 && find_char2>0){
    body_params = path.substr(find_char1+1);
}else if(method.toUpperCase() == "POST" && params_num ==1){
    log.info("debug");
    body_params = body_obj.getArgument(0).getValue();
    
}else if(method.toUpperCase() == "POST" && params_num>1){
    body_params = ""
    for(var i=0;i<params_num;i++){
        body_params+=body_obj.getArgument();
        }
}else{
    log.info("无有效参数!");    
    }


var secretKey = nonce+"//"+"jkdfsnkkkalslbcmsaad";
//var body_params = body_value.getArgument(0).getValue();
var hmac_value = cryptoHmac(body_params,secretKey);  //获取加密后的内容
log.info(hmac_value)
var sample_header_obj = sampler.getHeaderManager();
log.info(sample_header_obj);
log.info(sample_header_obj.size());

//将加密相关的信息添加到当前的请求头中
sample_header_obj.add(new org.apache.jmeter.protocol.http.control.Header("Sec-Fetch-timestamp",timestamp));
sample_header_obj.add(new org.apache.jmeter.protocol.http.control.Header("Sec-Fetch-nonce",nonce));
sample_header_obj.add(new org.apache.jmeter.protocol.http.control.Header("auth",hmac_value));
sample_header_obj.add(new org.apache.jmeter.protocol.http.control.Header("Sec-Fetch-Mode","sk"));

//将body的参数内容替换为加密后的内容
if(method.toUpperCase() == "POST" && params_num ==1){
    log.info("dfsfdsfdsfds");
    var new_body_params = cryptoHmac(body_params,secretKey);
    body_obj.getArgument(0).setValue(new_body_params);    
}

 

实际运行结果:

 在运行结果数中的参数信息:

 在运行结果数中的请求头信息

 

posted @ 2024-08-03 15:39  西夏一品唐  阅读(284)  评论(0编辑  收藏  举报