使用jmeter對字符串進行加密


之前介紹過如何利用jmeter函數助手構造時間戳參數,本次再來研究下另一個功能:對字符串進行加密

下面通過一個例子來演示一下如何對請求參數進行md5加密

准備工作

這次仍然使用百度通用翻譯接口當做案例,因為它剛好有一個參數就是經過md5加密得來的

之前用postman來發送這種有md5加密參數的請求時,也是用百度翻譯做的例子,傳送門:postman(十二):發送攜帶md5簽名、隨機數等參數的請求

接口文檔如下

 一些說明

1、簽名是為了保證調用安全,使用MD5算法生成的一段字符串,生成的簽名長度為 32位,簽名中的英文字符均為小寫格式;
2、為保證翻譯質量,請將單次請求長度控制在 6000 bytes以內。(漢字約為2000個);
3、簽名生成方法如下:
(1)將請求參數中的 APPID(appid), 翻譯query(q, 注意為UTF-8編碼), 隨機數(salt), 以及平台分配的密鑰(可在 管理控制台查看)
按照 appid+q+salt+密鑰 的順序拼接得到字符串1
(2)對字符串1做md5,得到32位小寫的sign
官方舉例:將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+秘鑰”進行加密

 

我目前用的jmeter版本是5.0,當前版本的函數助手中有2個函數可以實現字符串加密的功能: __digest  __MD5
 
__digest

 谷歌硬核翻譯:

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不合法(猜測可能在函數助手中不能引用外部變量,或者是引用的方式不對,總之這個方法我沒有走通)

 __MD5函數 也存在這個問題,不再做贅述
 
網上沖浪一番后找到了另一種實現方式: 使用beanshell腳本對字符串md5加密
 
在jmeter的lib目錄下,自帶commons-codec-1.11.jar(如果沒有,可以到maven庫下一個,下載地址: https://mvnrepository.com/,然后放到jmeter的lib目錄下),所以,可以借助apache工具類DigestUtils實現字符串加密

 

 針對這個翻譯接口,做一下如下改造

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,介紹了多種生成加密字符串的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM