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

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. 王艳 201771010127《面向对象程序设计(java)》第三周学习总结

    一:理论知识总结: 第一章:主要概述了java相比其他程序设计语言(如C语言.c++)之间的不同性能.为我们揭示了java这种语言的设计初衷一节截至目前java语言达到的效果.另外,还简要介绍了jav ...

  2. Understanding REST and RESTful APIs

    Understanding REST and RESTful APIs If you've spent any amount of time with modern web development, ...

  3. Mac 软件包管理器Homebrew使用指北

    Homebrew Homebrew由开发者 Max Howell 开发,并基于 BSD 开源,是一个非常方便的软件包包管理器工具. Homebrew 官网 Homebrew 的几个核心概念 在正式介绍 ...

  4. java中String转换成json,json转换成String

    前置添加pom <!-- 配置gson --> <dependency> <groupId>com.google.code.gson</groupId> ...

  5. [C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程

    截图 下载地址 Reflector.NET反编译工具 v8.5绿色版+注册机 下载地址:http://pan.baidu.com/s/1mgN1Cpi 密码:mx19 简介 .NET Reflecto ...

  6. [wordpress使用]002_主题

    使用WordPress作为博客内容管理系统有一个很大的好处是,WordPress拥有大量的优秀的免费模板.你所需要的是下载安装,和稍作修改.下面接着开始WordPress教程:WordPress主题 ...

  7. 【转】eclipse找不到或无法加载主类

    Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法! 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,bin文件夹下没有.class文件,至少遇到3次这个问题了 ...

  8. 设计带构造函数的Dog类 代码参考

    #include <iostream> #include <string> using namespace std; class Dog { private: string n ...

  9. 50个SQL语句(MySQL版) 问题四

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  10. php CURL 发送请求封装

    cURL可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 ...