使用jmeter对字符串进行加密

之前介绍过如何利用jmeter函数助手构造时间戳参数,本次再来研究下另一个功能:对字符串进行加密

下面通过一个例子来演示一下如何对请求参数进行md5加密

准备工作

这次仍然使用百度通用翻译接口当做案例,因为它刚好有一个参数就是经过md5加密得来的

之前用postman来发送这种有md5加密参数的请求时,也是用百度翻译做的例子,传送门:postman(十二):发送携带md5签名、随机数等参数的请求

接口文档如下

 一些说明

1、签名是为了保证调用安全,使用MD5算法生成的一段字符串,生成的签名长度为 32位,签名中的英文字符均为小写格式;
2、为保证翻译质量,请将单次请求长度控制在 6000 bytes以内。(汉字约为2000个);
3、签名生成方法如下:
(1)将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看)
按照 appid+q+salt+密钥 的顺序拼接得到字符串1
(2)对字符串1做md5,得到32位小写的sign
官方举例:将apple从英文翻译成中文:
请求参数:
q
= apple from = en to = zh appid = 2015063000000001 salt = 1435660288 平台分配的密钥: 12345678
生成sign: >拼接字符串1
拼接appid
=2015063000000001+q=apple+salt=1435660288+密钥=12345678 得到字符串1 =2015063000000001apple143566028812345678
>计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码) sign=md5(2015063000000001apple143566028812345678) sign=f89f9594663708c1605f3d736d01d2d4
完整请求为: http:
//api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

使用jmeter来实现

先把接口参数录入到jmeter

其中,sign就是把 appid+q+salt+秘钥 拼接并经过md5加密后得到的

所以我们这次要做的就是对 “appid+q+salt+秘钥”进行加密

 

我目前用的jmeter版本是5.0,当前版本的函数助手中有2个函数可以实现字符串加密的功能:__digest  __MD5
 
__digest

 谷歌硬核翻译:

Digest algorithm:加密算法,可以填写上图所示的那些,如MD2、MD5等

String to be hashed:把需要加密的字符串填写到这里

后面3个参数是选填

如果按照当前写死的参数来进行加密的话,String to be hashed处应该填写:2015063000000001+钢铁侠+1435660288+12345678,如下

 

 

 这样就生成了一个加密字符串,把它填写到sign处就好了

但是有一点必须注意,在参数中: q 代表需要翻译的字符,salt 是一个随机数,这两个参数都是动态变化的(因为每次翻译的字符不同、每次生成的随机数也不同)

所以在生成sign加密字符串时,不能用写死的 q 和 salt

 

因为在请求中定义好了参数q和salt以及appid等,所以接下来我尝试了如下写法

 

 在实际运行时,得不到正确的响应结果,总是提示sign不合法(猜测可能在函数助手中不能引用外部变量,或者是引用的方式不对,总之这个方法我没有走通)

 __MD5函数 也存在这个问题,不再做赘述
 
网上冲浪一番后找到了另一种实现方式:使用beanshell脚本对字符串md5加密
 
在jmeter的lib目录下,自带commons-codec-1.11.jar(如果没有,可以到maven库下一个,下载地址:https://mvnrepository.com/,然后放到jmeter的lib目录下),所以,可以借助apache工具类DigestUtils实现字符串加密

 

 针对这个翻译接口,做一下如下改造

1、在请求前添加一个配置元件:【用户定义的变量】,把可能变化的请求参数加到里面

 

 

2、在请求下面添加一个BeanShell PreProcessor,里面的脚本如下

第二行表示把 “appid+q+salt+秘钥”进行加密(这里就是从用户定义的变量中把对应参数的值取过来),把生成的加密字符串赋给sign

第三行表示定义一个变量msign,并把加密后的字符串传给msign

import org.apache.commons.codec.digest.DigestUtils;
String sign = DigestUtils.md5Hex("${appid}${q}${salt}ABCDEFGOAwerfdt8434ed");
vars.put("msign", sign); 

 

3、在http请求中引用这些定义好的参数变量

 

 运行一下查看结果

请求内容

 响应结果

 说明生成的加密字符串是合法能用的

 有兴趣可以看看这篇:https://www.cnblogs.com/uncleyong/p/9429752.html#_label4,介绍了多种生成加密字符串的方法

posted @ 2020-06-29 10:45  我是冰霜  阅读(1100)  评论(0编辑  收藏  举报