JMeter BeanShell 實現(xiàn)接口簽名驗簽及加解密

在利用JMeter進行接口測試或者性能測試的時候脏嚷,我們需要處理一些復雜的請求赁炎,比如對接口請求參數(shù)進行簽名,加密意系,響應數(shù)據(jù)的驗簽及解密泥耀,以及接口公共參數(shù)的處理,此時就需要利用BeanShell腳本了蛔添,關于BeanShell的使用小伙伴們可以查看網(wǎng)上相關文章痰催。今天主要和大家分享下接口簽名兜辞,驗簽,加解密夸溶,以及處理公共參數(shù)的例子逸吵,希望能幫助到小伙伴們。

一缝裁,思路

  • 約定:約定接口有統(tǒng)一的請求及響應格式扫皱,如:

    請求協(xié)議公共部分

參數(shù) 類型 是否必選 描述
appKey String 應用key
nonce String 32位UUID隨機字串,格式如:296f6fdd570244d98b6046ec135a5b8a
sign String 簽名
timestamp Long 請求時間戳捷绑,
transactionSn String 交易流水號
parameter Object 請求的業(yè)務對象

響應協(xié)議公共部分

參數(shù) 類型 描述
code String 返回碼
message String 返回消息韩脑,如錯誤信息
timestamp String 響應時間
transactionSn String 交易流水號
sign String 簽名
data Object 返回的業(yè)務對象

基于此約定,我們才能進一步統(tǒng)一處理粹污。

  • 引入外部簽名及加解密工具包
  • JMeter的HTTP請求->請求參數(shù)中只填寫業(yè)務對象(parameter)
  • 利用前置處理器(BeanShell PreProcessor),組裝公共請求對象->對業(yè)務參數(shù)對象進行加密->簽名
  • 利用后置處理器(BeanShell PostProcessor)對響應報文進行驗簽->解密段多。

二,實現(xiàn)

整體效果如下圖:

微信圖片編輯_20210518115705.jpg

關于如何建立測試計劃壮吩,線程組就不用一一描述了进苍,這里只關注核心功能實現(xiàn)。

  • HTTP請求參數(shù)(parameter)部分鸭叙,如:

    {
        "idCardNo":"511622198312241918",
        "name":"Leo"
    }
    
  • 接口調(diào)用前置處理器-簽名/加密(BeanShell PreProcessor),BeanShell代碼如下:

    //引入依賴
    import com.javacoo.service.base.security.util.SignUtil;
    import com.javacoo.service.base.security.util.SecurityUtil;
    import com.javacoo.service.base.utils.WebUtil;
    import com.javacoo.service.base.utils.FastJsonUtil;
    import com.javacoo.service.base.BaseRequest;
    import java.util.Calendar;
    import java.util.Map;
    import org.apache.jmeter.config.Arguments; 
    
    //開始處理
    log.info("接口調(diào)用前置處理器-簽名/加密相關處理");
    Arguments args = sampler.getArguments(); 
    
    //獲取請求參數(shù)
    String body = args.getArgument(0).getValue();
    log.info("業(yè)務參數(shù):{}",body);
    
    //獲取簽名所需參數(shù)
    String appKey = "${appKey}";
    String secretkey = "${secretkey}";
    String nonce = WebUtil.genTransSn();
    String transactionSn = WebUtil.genTransSn();
    Long timestamp = Calendar.getInstance().getTimeInMillis();
    
    //加密
    Map bodyMap = FastJsonUtil.stringToCollect(body);
    log.info("params:{}",bodyMap);
    for(Map.Entry entry : bodyMap.entrySet()){
        entry.setValue(SecurityUtil.encryptDes(entry.getValue(),secretkey));
    }
    body = FastJsonUtil.toJSONString(bodyMap);
    log.info("加密后業(yè)務參數(shù):{}",body);
    
    //簽名
    String sign = SignUtil.clientSign(body,nonce,timestamp.toString(),secretkey);
    log.info("sign:{}",sign);
    
    //組裝接口請求對象
    BaseRequest baseRequest = new BaseRequest();
    baseRequest.setAppKey(appKey);
    baseRequest.setNonce(nonce);
    baseRequest.setTimestamp(timestamp);
    baseRequest.setTransactionSn(transactionSn);
    baseRequest.setSign(sign);
    baseRequest.setParameter(FastJsonUtil.toBean(body));
    //轉(zhuǎn)換為JSON字符串
    String reqBody = FastJsonUtil.toJSONString(baseRequest);
    log.info("reqBody:{}",reqBody);
    
    //重置參數(shù)值
    args.getArgument(0).setValue(reqBody);
    
  • 接口調(diào)用后置處理程序-驗證簽名/解密(BeanShell PostProcessor),BeanShell代碼如下:

    //引入依賴
    import com.javacoo.service.base.security.util.SignUtil;
    import com.javacoo.service.base.BaseResponse;
    import com.javacoo.service.base.utils.FastJsonUtil;
    import org.apache.commons.lang3.StringUtils;
    
    //開始處理
    log.info("接口調(diào)用后置處理器-驗證簽名");
    String responseData = prev.getResponseDataAsString();
    log.info("返回數(shù)據(jù):{}",responseData);
    BaseResponse baseResponse = FastJsonUtil.toBean(responseData, BaseResponse.class);
    if(StringUtils.isBlank(baseResponse.getSign()) || baseResponse.getData().get() == null){
        return;
    }
    //轉(zhuǎn)換
    String s = FastJsonUtil.toJSONString(baseResponse.getData().get());
    log.info("請求返回業(yè)務json:{}",s);
    log.info("請求返回簽名:{}",baseResponse.getSign());
    String secretkey = "${secretkey}";
    
    //驗證簽名
    if (SignUtil.cloudVerifySign(baseResponse.getSign(), s,baseResponse.getTransactionSn(),baseResponse.getTimestamp().toString(), secretkey)) {
           log.info("返回數(shù)據(jù)合法");
    } else {
           log.info("返回數(shù)據(jù)被篡改");
    }
    //解密,TODO
    

三觉啊,注意事項及問題

  • JMeter不支持java1.5以后的語法,不支持泛型沈贝,如要使用則需要封裝成JAR包柄延。

一些信息

路漫漫其修遠兮,吾將上下而求索
碼云:https://gitee.com/javacoo
QQ群:164863067
作者/微信:javacoo
郵箱:xihuady@126.com
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缀程,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌市俊,老刑警劉巖杨凑,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摆昧,居然都是意外死亡撩满,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門绅你,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伺帘,“玉大人,你說我怎么就攤上這事忌锯∥奔蓿” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵偶垮,是天一觀的道長张咳。 經(jīng)常有香客問我帝洪,道長,這世上最難降的妖魔是什么脚猾? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任葱峡,我火速辦了婚禮,結果婚禮上龙助,老公的妹妹穿的比我還像新娘砰奕。我一直安慰自己,他們只是感情好提鸟,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布军援。 她就那樣靜靜地躺著,像睡著了一般沽一。 火紅的嫁衣襯著肌膚如雪盖溺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天铣缠,我揣著相機與錄音烘嘱,去河邊找鬼。 笑死蝗蛙,一個胖子當著我的面吹牛蝇庭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捡硅,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哮内,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壮韭?” 一聲冷哼從身側(cè)響起北发,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喷屋,沒想到半個月后琳拨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡屯曹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年狱庇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恶耽。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡密任,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偷俭,到底是詐尸還是另有隱情浪讳,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布涌萤,位于F島的核電站驻债,受9級特大地震影響乳规,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜合呐,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一暮的、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淌实,春花似錦冻辩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至放坏,卻和暖如春咙咽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淤年。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工钧敞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麸粮。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓溉苛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弄诲。 傳聞我的和親對象是個殘疾皇子愚战,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • XService:為組件化,快速構建微服務而生 什么是XService? XService接口服務快速開發(fā)框架,基...
    javacoo閱讀 974評論 0 5
  • 現(xiàn)在我們有這樣一個接口做為壓測對象: 其使用HTTP協(xié)議進行交互齐遵,使用RSA加密算法進行加密傳輸寂玲,然后進行密文報文...
    聯(lián)旺閱讀 230評論 0 0
  • 周末在家沒事拓哟,將公司的登錄接口和獲得資產(chǎn)的接口拿出來練練手,用Jmeter編寫留美,感覺Jmeter和postman很...
    愛睡覺的小章魚閱讀 816評論 0 2
  • 一、jmeter接口測試原理 1伸刃、HTTP請求常用的post谎砾、get請求,包括請求頭信息參數(shù)捧颅、請求體參數(shù)景图、返回信息...
    遠航天下閱讀 1,133評論 0 3
  • Jmeter接口加密測試小結 最近,公司做接口測試碉哑,但是發(fā)送請求前需要對個別參數(shù)做加密處理挚币。之前一直沒做過這...
    XU_旭閱讀 4,663評論 1 1