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