前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用jmeter对字符串进行加密

使用jmeter对字符串进行加密

作者头像
冰霜
发布2022-03-19 09:07:56
1.2K0
发布2022-03-19 09:07:56
举报

之前介绍过如何利用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

代码语言:javascript
复制
官方举例:将apple从英文翻译成中文
代码语言:javascript
复制
请求参数:

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 algorithm:加密算法,可以填写上图所示的那些,如MD2、MD5等

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

后面3个参数是选填

如果按照当前写死的参数来进行加密的话,

String to be hashed处应该填写:

2015063000000001钢铁侠143566028812345678,如下

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

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

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

由于前面在请求中定义好了参数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

里面的脚本如下

代码语言:javascript
复制
import org.apache.commons.codec.digest.DigestUtils;
String sign = DigestUtils.md5Hex("${appid}${q}${salt}ABCDEFGOAwerfdt8434ed");
vars.put("msign", sign);

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

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

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

运行一下查看结果

请求内容

响应结果

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

有兴趣可以看看这篇:

https://www.cnblogs.com/uncleyong/p/9429752.html#_label4

介绍了多种生成加密字符串的方法

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档