jmeter經過BeanShell,實現對接口參數HmacSHA256加密(轉)

jmeter經過BeanShell,實現對接口參數HmacSHA256加密2019-04-29 05:10

ps. 最近抓包網站的登錄請求,發現就2個參數,用戶名和密碼,經過工具去請求這個接口,一直返回參數錯誤。java

緣由大概有兩個吧:1.未指定鏈接類型  2.參數不正確(密碼未通過加密傳輸)json

抓包能夠看出來服務器接收的是json格式的傳輸。數組

在jmeter裏添加http頭部管理器中添加鏈接類型服務器

Content-Type application/json

 

接下來講下對http請求中的參數加密問題,該網站服務端用的是HMACSHA256加密。app

下面使用java方法實現:eclipse



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包,重啓jmeterui

新建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二次開發,參考http://www.javashuo.com/article/p-erbcwmrb-x.html

相關文章
相關標籤/搜索