jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)
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 = ; b!=null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == )
hs.append('');
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 = ; i < bts.length; i++) {
tmp = (Integer.toHexString(bts[i] & 0xFF));
if (tmp.length() == ) {
des += "";
}
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
jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)的更多相关文章
- jmeter之beanshell取出需要参数,传递给下个请求
jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...
- jmeter通过BeanShell 脚本,实现对http请求参数的加密
jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...
- jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...
- Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密
[前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...
- 利用JMeter的beanshell进行接口的加密处理
最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进 ...
- JMeter中BeanShell实现写入文件
1.首先F:\test.txt文件为空
- 记录jmeter使用beanshell断言获取复杂的json字符串参数值
实战示例 测试场景 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式 ...
- mvc url路由参数的加密和解密
查看某个信息的时候一般会在url上加上该信息在数据库中对应的主键id(而且一般是自增的) url是这样子的 xxxDetail/1 , 虽然对于我们开发人员来说可以这种显式的数据库主键会方便调试过程, ...
- jmeter之beanshell提取json数据
Jmeter BeanShell PostProcessor提取json数据 假设现有需求: 提取sample返回json数据中所有name字段对应的值,返回的json格式如下: {“body”:{“ ...
随机推荐
- Java进程间通信学习
转自:https://www.iteye.com/blog/polim-1278435 进程间通信的主要方法有:(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共 ...
- Markdown随笔
Markdown随笔 这两天兴致来了,想尝试一下使用 Markdown. 写这篇博客时我用的是: MarkdownPad 2 关于 MarkdownPad 2 的安装破解网上有很多教程了,这里我就不赘 ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- Mysql 主从一致校验工具------Maatkit工具包
Maatkit工具包 http://www.maatkit.org/ 简介 maatkit是一个开源的工具包,为mysql日常管理提供了帮助.目前,已被Percona公司收购并维护.其中: mk-ta ...
- C 语言实现回调函数
优点 不需要改变调用的主函数,只需添加命令和相应函数. #include "stdio.h" #include "stdlib.h" #include &quo ...
- Python基础(二)--基本数据类型、格式化输出、基本运算符
一.基本数据类型 1.数字类型 #int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary ...
- Networking POJ - 1287
题目链接:https://vjudge.net/problem/POJ-1287 思路:最小生成树板子题 #include <iostream> #include <cstdio&g ...
- js 驼峰命名和下划线互换
代码走你 // 下划线转换驼峰 function toHump(name) { return name.replace(/\_(\w)/g, function(all, letter){ return ...
- Eslint 允许使用双等号
资料 网址 ESlint: Expected !== and instead saw != https://stackoverflow.com/questions/48375316/eslint-ex ...
- pointnet++论文的翻译
参考: https://blog.csdn.net/weixin_40664094/article/details/83902950 https://blog.csdn.net/pikachu_777 ...