zoukankan      html  css  js  c++  java
  • 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 = 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

  • 相关阅读:
    minimum-path-sum
    pascals-triangle
    Java -- 二分查找
    redis缓存雪崩,击穿,穿透(copy)
    使用redis限制提交次数
    数据库的悲观锁和乐观锁
    mysql常用命令
    php压缩Zip文件和文件打包下载
    php去除数据库的数据空格
    php获取本年、本月、本周时间戳和日期格式的实例代码(分析)
  • 原文地址:https://www.cnblogs.com/a00ium/p/11100798.html
Copyright © 2011-2022 走看看