使用jmeter对字符串进行加密
之前介绍过如何利用jmeter函数助手构造时间戳参数,本次再来研究下另一个功能:对字符串进行加密
下面通过一个例子来演示一下如何对请求参数进行md5加密
准备工作
这次仍然使用百度通用翻译接口当做案例,因为它刚好有一个参数就是经过md5加密得来的
之前用postman来发送这种有md5加密参数的请求时,也是用百度翻译做的例子,传送门:postman(十二):发送携带md5签名、随机数等参数的请求
接口文档如下
一些说明
官方举例:将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+秘钥”进行加密
![](https://img2020.cnblogs.com/blog/1158674/202006/1158674-20200628221155908-511520106.png)
谷歌硬核翻译:
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不合法(猜测可能在函数助手中不能引用外部变量,或者是引用的方式不对,总之这个方法我没有走通)
![](https://img2020.cnblogs.com/blog/1158674/202006/1158674-20200629100702637-324375003.png)
针对这个翻译接口,做一下如下改造
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,介绍了多种生成加密字符串的方法