之前介紹過如何利用jmeter函數助手構造時間戳參數,本次再來研究下另一個功能:對字符串進行加密
下面通過一個例子來演示一下如何對請求參數進行md5加密
准備工作
這次仍然使用百度通用翻譯接口當做案例,因為它剛好有一個參數就是經過md5加密得來的
之前用postman來發送這種有md5加密參數的請求時,也是用百度翻譯做的例子,傳送門:postman(十二):發送攜帶md5簽名、隨機數等參數的請求
接口文檔如下
一些說明
官方舉例:將apple從英文翻譯成中文: 請求參數:
q = apple from = en to = zh appid = 2015063000000001 salt = 1435660288 平台分配的密鑰: 12345678
生成sign: >拼接字符串1
拼接appid=2015063000000001+q=apple+salt=1435660288+密鑰=12345678 得到字符串1 =2015063000000001apple143566028812345678
>計算簽名sign(對字符串1做md5加密,注意計算md5之前,串1必須為UTF-8編碼) sign=md5(2015063000000001apple143566028812345678) sign=f89f9594663708c1605f3d736d01d2d4
完整請求為: http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
使用jmeter來實現
先把接口參數錄入到jmeter
其中,sign就是把 appid+q+salt+秘鑰 拼接並經過md5加密后得到的
所以我們這次要做的就是對 “appid+q+salt+秘鑰”進行加密

谷歌硬核翻譯:
Digest algorithm:加密算法,可以填寫上圖所示的那些,如MD2、MD5等
String to be hashed:把需要加密的字符串填寫到這里
后面3個參數是選填
如果按照當前寫死的參數來進行加密的話,String to be hashed處應該填寫:2015063000000001+鋼鐵俠+1435660288+12345678,如下
這樣就生成了一個加密字符串,把它填寫到sign處就好了
但是有一點必須注意,在參數中: q 代表需要翻譯的字符,salt 是一個隨機數,這兩個參數都是動態變化的(因為每次翻譯的字符不同、每次生成的隨機數也不同)
所以在生成sign加密字符串時,不能用寫死的 q 和 salt
因為在請求中定義好了參數q和salt以及appid等,所以接下來我嘗試了如下寫法
在實際運行時,得不到正確的響應結果,總是提示sign不合法(猜測可能在函數助手中不能引用外部變量,或者是引用的方式不對,總之這個方法我沒有走通)

針對這個翻譯接口,做一下如下改造
1、在請求前添加一個配置元件:【用戶定義的變量】,把可能變化的請求參數加到里面
2、在請求下面添加一個BeanShell PreProcessor,里面的腳本如下
第二行表示把 “appid+q+salt+秘鑰”進行加密(這里就是從用戶定義的變量中把對應參數的值取過來),把生成的加密字符串賦給sign
第三行表示定義一個變量msign,並把加密后的字符串傳給msign
import org.apache.commons.codec.digest.DigestUtils; String sign = DigestUtils.md5Hex("${appid}${q}${salt}ABCDEFGOAwerfdt8434ed"); vars.put("msign", sign);
3、在http請求中引用這些定義好的參數變量
運行一下查看結果
請求內容
響應結果
說明生成的加密字符串是合法能用的
有興趣可以看看這篇:https://www.cnblogs.com/uncleyong/p/9429752.html#_label4,介紹了多種生成加密字符串的方法