jmeter通過BeanShell,實現對接口參數HmacSHA256加密2019-04-29 05:10
ps. 最近抓包網站的登陸請求,發現就2個參數,用戶名和密碼,通過工具去請求這個接口,一直返回參數錯誤。
原因大概有兩個吧:1.未指定連接類型 2.參數不正確(密碼未經過加密傳輸)
抓包可以看出來服務器接收的是json格式的傳輸。
在jmeter里添加http頭部管理器中添加連接類型
Content-Type | application/json |
接下來說下對http請求中的參數加密問題,該網站服務端用的是HMACSHA256加密。
下面使用java方法實現:
package com.Base64; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HMACSHA256 { /** * 將加密后的字節數組轉換成字符串 * * @param b 字節數組 * @return 字符串 */ public static String byteArrayToHexString(byte[] b) { StringBuilder hs = new StringBuilder(); String stmp; for (int n = 0; b!=null && n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF); if (stmp.length() == 1) hs.append('0'); hs.append(stmp); } return hs.toString().toLowerCase(); } /** * sha256_HMAC加密 * @param message 消息 * @param secret 秘鑰 * @return 加密后字符串 */ public static String sha256_HMAC(String message, String secret) { String hash = ""; try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] bytes = sha256_HMAC.doFinal(message.getBytes()); hash = byteArrayToHexString(bytes); } catch (Exception e) { System.out.println("Error HmacSHA256 ===========" + e.getMessage()); } return hash; } }
該sha256_HMAC方法接收兩個參數,message消息,可以理解為密碼,secret秘鑰:用戶名。具體可以百度下該加密方式的原理。
通過eclipse編寫完成后,導出jar包。
在src處右鍵export導出jar包,命名為 Base64URLSafe.jar,放在jmeter/lib/ext
在jmeter測試計划底部library中添加該jar包,重啟jmeter
新建http請求后,在下面加一個前置處理器:BeanShell PreProcessor
ps:因為上一步已經把jar引入測試計划了,這里可以直接導入該jar包里面的java包,HMACSHA256在com.Base64這個包里,直接引入即可。
插入如下代碼:此處把用戶名和密碼加入了環境變量,以便之后的參數化配置。
import com.Base64.*; //new一個實例 HMACSHA256 psSha256 = new HMACSHA256(); //調用HMACSHA256類的sha256_HMAC方法,進行hmacsha256加密 String psStr=psSha256.sha256_HMAC("${password}","${email}"); vars.put("PASSWORD_SHA256",psStr);
在需要用到變量的地方直接引用:
運行結果如下:
可以看到參數經過HMACSHA256加密后正常傳輸給后台接收,今后也可以通過引用jar包的方式,把自己想實現的功能封裝后導出給jmeter調用。 如果后台是加密的話,最好問下開發用的是哪種加密方式,我就被sha256加密坑了半天。下面附上sha256的加密方式:
package com.Base64; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class SHA256 { public static String Encrypt(String strSrc,String encName) { MessageDigest md = null; String strDes = null; byte[] bt = strSrc.getBytes(); try { if (encName == null || encName.equals("")) { encName = "SHA-256"; } md = MessageDigest.getInstance(encName); md.update(bt); strDes = bytes2Hex(md.digest()); } catch (NoSuchAlgorithmException e) { return null; } return strDes; } public static String bytes2Hex(byte[] bts) { String des = ""; String tmp = null; for (int i = 0; i < bts.length; i++) { tmp = (Integer.toHexString(bts[i] & 0xFF)); if (tmp.length() == 1) { des += "0"; } des += tmp; } return des; } } //jmeter引入 import com.Base64.*; //new 一個實例 SHA256 psSha256 = new SHA256(); //調用sha256類的encrypt方法,進行sha256加密 String psStr=psSha256.Encrypt("password1","SHA-256"); String psStrUpper = psStr.toUpperCase(); vars.put("PASSWORD_SHA256",psStrUpper);
如果對jmeter二次開發,參考https://blog.csdn.net/y100100/article/details/80701049