jmeter通过BeanShell,实现对接口参数HmacSHA256加密

ps. 最近抓包网站的登陆请求,发现就2个参数,用户名和密码,通过工具去请求这个接口,一直返回参数错误。

原因大概有两个吧:1.未指定连接类型  2.参数不正确(密码未经过加密传输)

抓包可以看出来服务器接收的是json格式的传输。

在jmeter里添加http头部管理器中添加连接类型

Content-Typeapplication/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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值