首先,来看一下接口签名加密规则

1.需要参于签名的参数:

	a. 在请求参数列表中,除去 cliSign 参数外,其他需要使用到的参数皆是要签名的参数。

2.生成签名字符串

	a.	没有值的参数无需传递,也无需包含到待签名数据中

	b.	签名数据应该是原生值而不是 encoding 之后的值

	c.	若遇参数值为数组时,请以char=7对应字符进行分割此参数的多个值

	d. 按签名参数 a 到 z 的顺序排序("&"是分割开出多个参数)

		签名参数字符串如下:

		params = channel =0&password=abc&userid=13876

		pass = md5(params + appkey).toLowerCase() 注:“+”加与为字符串相连符,不在签名字符里,appkey为秘钥,为双方平台约定字符

		加密后cliSign = pass.substring(5, 21);全部小写后,获取前8到24位共16位传到服务端;

	e.  针对部分CDN接口若有传中文,客户端请在对中文URLEncoder后加密

3.开发测试环境签名密钥:

	appkey="test888"

beanshell代码如下:

import org.apache.commons.codec.digest.DigestUtils; 

//业务字段
String accessToken = vars.get("access_token");
String userId = vars.get("user_id");
String videoId = vars.get("videoId"); //POST/get请求公共参数
String appId = vars.get("appId");
String brand = vars.get("brand");
String channel = vars.get("channel");
String device = vars.get("device");
String platform = vars.get("platform");
String sysVersion = vars.get("sysVersion");
String times = vars.get("times");
String version = vars.get("version");
String appkey = vars.get("appkey"); //将签名传给cliSign参数,使用treemap,可自动进行排序
Map map = new TreeMap(); map.put("accessToken", accessToken);
map.put("userId", userId);
map.put("videoId", videoId); map.put("appId", appId);
map.put("brand", brand);
map.put("channel", channel);
map.put("device", device);
map.put("platform", platform);
map.put("sysVersion", sysVersion);
map.put("times",times);
map.put("version", version); //URLEncoder.encode(value, "UTF-8") 对中文进行格式化,这里不需要 StringBuffer sb = new StringBuffer();
for (Map.Entry entry : map.entrySet()) {
sb.append(entry.getKey() + "=" + entry.getValue());
sb.append("&");
}
String s = sb.toString();
if (s.endsWith("&")) {
s = org.apache.commons.lang.StringUtils.substringBeforeLast(s, "&");
}
log.info("Map转换为URL编码"+s); String str1 = s+appkey;
log.info("待加密字符串为:"+str1);
//进行md5加密
String pass = DigestUtils.md5Hex(str1).toLowerCase();
log.info("加密后的值:"+pass);
//截取前8到21位为签名
String sign = pass.substring(5, 21);
log.info("最终签名为:"+sign);
//将签名传给cliSign参数
vars.put("cliSign",sign);

技巧总结

  1. 将可能发生变动的参数均进行参数化,然后使用vars.put()方法获取,这样以后就不需要再修改beanshell中的代码
  2. 由于每个接口都需要用一个beanshell来获取签名,最好将业务参数和公共参数分开,便于修改和查看
  3. 对于关键变量,将其打印到日志中,方便定位问题,比如我之前碰到的问题:
    a. 不确定拼接后的参数是否正确、顺序是否正确,是否需要用URLEncoder进行转码或者获取参数时出错等,只有打印出来后才能知道;
b.不确定加密后的值是否正确,有可能与开发使用的加密方法不一致;
c. 不确定截取后,最终签名是否正确
签名机制就是这样,每一步都不能出错,需要步步为营,抽丝剥茧。找到是哪一步出的问题

附录:URL在线转码测试

本次的坑

  1. 从csv文件中读取的参数,自动加上了“”,导致最终传参不正确(在csv文件配置中将【是否允许带引号】设置为true即可);
  2. 对参数进行了URLEncoder转码,后来发现不需要;
  3. 能复制就不要手写,有的时候参数名就错了一个字母,但是找起来真的很头疼;
  4. 如果可以,最好找开发用一个实际的接口进行详细的示例,只看文档会跑偏。

Jmeter使用beanshell对数据进行加密传输的更多相关文章

  1. 利用JMeter的beanshell进行接口的加密处理

    最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进 ...

  2. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  3. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

  4. Jmeter(十九) Md5加密操作之-------BeanShell PreProcessor(转载)

    转载自 http://www.cnblogs.com/yangxia-test 背景: 有一些登录会做一些md5校验,通过jmeter的BeanShell可以解决MD5加密情况. 1.首先需要一个解码 ...

  5. 加密传输SSL协议4_综合方案

    隔了那么多天终于有时间继续把这个专题做完了,这次一定连续写完这方面的笔记. 上篇博文说明了非对称加密和对称加密各自的优缺点,那么就很自然的衍生出了一种综合的方案. 两种方案的结合--扬长避短 首先发送 ...

  6. jmeter通过BeanShell 脚本,实现对http请求参数的加密

    jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...

  7. jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)

    jmeter通过BeanShell,实现对接口参数HmacSHA256加密2019-04-29 05:10 ps. 最近抓包网站的登陆请求,发现就2个参数,用户名和密码,通过工具去请求这个接口,一直返 ...

  8. jmeter之beanshell提取json数据

    Jmeter BeanShell PostProcessor提取json数据 假设现有需求: 提取sample返回json数据中所有name字段对应的值,返回的json格式如下: {“body”:{“ ...

  9. jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密

    前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...

随机推荐

  1. java web基础

    WEB基础 C/S:即服务器-客服机(Client-Server)结构.C/S结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务.客户通过局域网与服务器相连,接受用户的请求,并 ...

  2. vue中template的三种写法

    第一种(使用模板字符串)早期字符串拼接年代 <div id="app"></div> new Vue({ el: "#app", tem ...

  3. Java 面向对象基础

    面向对象的基础 局部变量和成员变量区别: 1)定义的位置不同    成员变量直接定义在class中    局部变量在某个{}中或者再某个方法中 2)在内存中的位置不同    对象的成员变量会在内存中的 ...

  4. 转 document.compatMode介绍

    对于document.compatMode,很多朋友可能都根我一样很少接触,知道他的存在却不清楚他的用途.今天在ext中看到 document.compatMode的使用,感觉这个对于我们开发兼容性的 ...

  5. 【JUC】CountDownLatch和Java枚举的使用例子

    public enum CountryEnum { ONE(1,"春"), TWO(2,"夏"), THREE(3,"秋"), FOUR(4 ...

  6. PIC单片机的i2c的程序

    #include<pic.h>#define uchar unsigned char#define uint unsigned int#define add 0xaa__CONFIG(0x ...

  7. Elasticsearch到底哪点好?

    少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 从今天开始准备给大家带来全新 ...

  8. win10系统systeminfo命令的过滤用法

    一.背景: 在win10系统使用systeminfo命令可以查看windows系统信息,但是,默认显示的是全部信息,由于显示内容过多,这对查看特定信息带来一定麻烦.考虑使用该命令时能否使用过滤功能,直 ...

  9. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置

    一.Eureka注册中心和客户端配置Demo. 1.Server端 a.使用Idea创建Spring项目,如下所示: b.相关配置 application.yaml配置文件如下: # eureka本身 ...

  10. Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, In ...