jmeter JSR223 preprocessor javascript 接口信息加密
在进行接口测试或压测时,有时候需要对接口内容进行加密处理,否则服务器会直接拒绝请求。以下通过jmeter引入cryptoJS包的方式来实现接口参数信息的加密。
先下载javascript 的cryptoJS 包,将文件拷贝到jmeter的bin目录中。
在jmeter 前置处理器中添加JSR223 preProcessor,如:jmeter-> pre processor -> JSR223 preprocessor,选择语言:javascript。
通过load(uri);加载cryptoJS的文件,当前初始路径为jmeter的bin目录。
定义引入的cryptoJS 变量。需要注意的是虽然JSR 223执行javascript语言,但是也不是全支持javascript语言。如定义变量关键字不支持:const、let之类的。因此定义变量尽可能用var 关键字。
定义好cryptoJS变量后,可根据实际接口的加密方式,进行相关脚本的设计。
以下是jmeter 上javascript的hmac256加密代码示例及说明仅供参考:
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); }
实际运行结果:
在运行结果数中的参数信息:
在运行结果数中的请求头信息