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); }
實際運行結果:

在運行結果數中的參數信息:
在運行結果數中的請求頭信息


浙公網安備 33010602011771號