天天看點

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

閱讀文本大概需要3分鐘。

今天刷github發現了一個不錯的線上的電子書:

https://lingcoder.github.io/OnJava8/#/

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

最近有個活動的壓測,之前也做過其他壓測,不過沒有這一次複雜。此次我面臨的問題是:

1. 所有的接口都經過網關,意味着:入參和出參都需要加密,是所有的參數而不是單個參數的加密;

2.一共是三個接口,接口之間都需要擷取上個接口傳回的資料的某個值再全部加密後,去請求;

   接口大緻是這樣的:POST url  原參數為{"uid":"",phone":"13531127781"},不過真正上傳是把整個參數加密在上傳的,還有就是phone是參數,在做壓測時肯定需要大量的手機号 ;

   經過查詢各種資料後,終于一一解決了問題,是以做個記錄,以等待以後使用或者希望能幫助其他人;

  因為jmeter是使用java語言開發的,使用比較靈活。可以配合jar包,在配合jmeter自帶的插件來實作加解密;具體步驟是:

   跟開發要一個加解密的jar包,不過你需要之前加解密的類名和方法名;例如這樣:

  1. package com.ziroom.encrypt.gui.utils;
  2. import com.google.common.base.Strings;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.SecretKey;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.DESKeySpec;
  7. import javax.crypto.spec.IvParameterSpec;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. public class DESEncrypt
  11. {
  12. private static final Logger log = LoggerFactory.getLogger(DESEncrypt.class);
  13. private static final String keyString = "vpRZ1kmU";
  14. private static final String ivString = "EbpU4WtY";
  15. public static String encrypt(String content)
  16. try
  17. if (Strings.isNullOrEmpty(content)) {
  18. return null;
  19. }
  20. IvParameterSpec iv = new IvParameterSpec("EbpU4WtY".getBytes());
  21. DESKeySpec dks = new DESKeySpec("vpRZ1kmU".getBytes());
  22. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  23. SecretKey key = keyFactory.generateSecret(dks);
  24. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  25. cipher.init(1, key, iv);
  26. byte[] result = cipher.doFinal(content.getBytes("utf-8"));
  27. return DESPlus.byteArr2HexStr(result);
  28. catch (Exception e)
  29. log.error("ENCRYPT ERROR:" + e);
  30. public static String decrypt(String content)
  31. cipher.init(2, key, iv);
  32. byte[] result = cipher.doFinal(DESPlus.hexStr2ByteArr(content));
  33. return new String(result, "utf-8");

類名就是DESEncrypt,加密方法名是encrypt,解密方法是decrypt;

0x01: 有了jar包後,可以把jar包導入jmeter的測試計劃裡,如下圖:

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

0x02: 接下來是jar包的使用,jmeter有兩個插件:前置處理器BeanShell PreProcessor,和後置處理器BeanShell PostProcessor;前者用來處理http請求前的操作,後者則相反;接下來我們來處于加密請求:首先是添加一個 sampler -http請求:

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

因為請求的内容都是加密後的,是以我們暫時不考慮請求的參數,或者可以簡單說一下,上面截圖中Body Data裡的 ${smsResponse}就是前置處理器的最終加密後參數值;

0x03: 因為文章開篇就說了,phone變量是取值範圍很大,如果變量取值範圍大就使用使用CSV,但是如果小的話就可以選擇“使用者參數”;“CSV”是jmeter的一種配置元件,是參數化的一種,具體可以參考這篇文章,我就直接貼我圖了,懶得說那麼說了。嘻嘻,另外下面是我的批量生成手機号的python代碼

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)
  1. import random
  2. #生成手機号
  3. def create_phone():
  4. prelist = ["130", "131", "132", "133", "134", "135", "136", "137",
  5. "138", "139", "147", "150", "151", "152", "153",
  6. "155", "156", "157", "158", "159", "186", "187", "188"]
  7. phone = random.choice(prelist)+''.join(random.choice("0123456789") for i in range(8))
  8. return phone
  9. #寫入檔案
  10. def write_file():
  11. with open('/Users/mengyanjing/Desktop/phone','a') as f:
  12. f.write(create_phone() + '\r')
  13. #生成num次手機号,并且寫入檔案内
  14. def batchCreate(num):
  15. i = 0
  16. while (i<num):
  17. write_file()
  18. i = i+1
  19. if __name__ == '__main__':
  20. batchCreate(100)

0x04: 在上面圖中寫了一個“使用者參數”插件,下面來說說它,這個是前置處理器的一種,也是jmeter 參數化的一種,。我此次選用“使用者參數”是因為在請求時參數都是加密後的,而加密前的參數必須要找個位置存放,是以就選擇了它,廢話不多,直接上圖:

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

0x05: 然後再填加一個前置處理器-BeanShell PreProcessor,前面說過jmeter支援java語言來補充一個額外的功能,BeanShell PreProcessor就是可以讓你實作你的額外需求(把參數加密)。太具體的不說了,直接貼圖把。需要指出的是:vars.put("A",A),可以把你擷取的内容放入jmeter的全局變量,調用的使用直接使用

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

{smsResponse}就是這麼來的;C = vars.get("C") 方法可以從jmeter的使用者參數插件内擷取你輸入的内容;

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

備注:如果想檢視是否真正加密成功,可以添加一個Debug Sampler在後面填寫你加密後的參數,如圖所示:

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

0x06: 最終就是解密了,這個時候需要添加的是BeanShell PostProcessor,從名稱就可以看出它是jmeter的後置處理器,可以實作把伺服器傳回來的值進行處理,直接貼圖吧,貼圖前還是需要指出String response_data = prev.getResponseDataAsString();是用來擷取伺服器傳回值的通用方法

jmeter參數化csv+使用者參數配合(請求加密,傳回解密)

寫在最後,順便在提提jmeter的正規表達式,之前寫過一篇文章用來介紹過,具體可以檢視我是傳送門;因為這次需求是需要提取解密後的内容,當時懵逼了很久,後來看到了正規表達式竟然有一個Jmeter Variable Name to use,哈哈哈,正好解決了我的需求,具體看截圖把,懶得寫太多了。

繼續閱讀