Jmeter调用python完成HmacSHA256加密处理【转载】

Jmeter调用python完成HmacSHA256加密处理(原文地址:https://www.dazhuanlan.com/2019/09/28/5d8f69c02b0fa/?__cf_chl_jschl_tk__=362833cdbc5bf2c77cdcc10781e2ae9d6fb7f12a-1584619815-0-ASlzY7TigC2NELKqOfLN0THrndji2-zagLB0THdHpWNNZ35BImklMrkaC3MS_Iip741eHLfqWuOvCbwvn9mSktDre7v0bOjpEa66U_E6Cm0W7sUiRNqfhJ9nmLkVDq2xK0lyfW6KFeS7_we28X8_9YUGK4LGR6VCcWnVRmVgLU5wChWZDZECUiHbnK-QWKn4LiipZSWKPflOgk4mZn7aHb_cgMwNg3NRoLe_SOJR9EjES-kXhQXFDesLhm6jhedtZzmihEUlzs8DEfo1YDbrWHfAoppbiZAggLS-hKZxnvEz93WRSujjrwJBOgtKstyZ0w

前言

同事有个需求,一个获取人员信息的接口,请求头里面需要有一个sign参数,这个参数是几个实时获取的参数最后进行Hmachash256加密之后生成的,具体示例:
获取用户接口:

1
GET http://192.168.0.1/api/user?userName=20190101&tenant=testtenant

 

请求头:

key value
Authorization Bearer ${token}
content-type application/json
tenant testtenant
timestamp 当前时间戳
randoms 随机数
sign 签名

其中签名生成规则如下:
tenanttesttenantuserName20190101tenanttesttenanttimestamp当前时间戳randoms随机数
这一长串再使用指定密码,进行HmacSHA256加密,生成的密文即为sign

加密工具

jmeter方案

因为后期接口要进行性能测试,所以还是选了jmeter进行性能测试,按照接口描述的先排序再加密,在jmeter中,首先想到的就是通过beanshell外部实现,然后生成对应jar包,在jmeter中引用,然后就有个问题,我java太菜了。。。没办法,折腾python。

jmeter中使用python脚本

在jmeter中使用python脚本,搜了下,找到三种方式:
1. 使用Jython包(地址失效,以下是下载的文件)

 

下载地址
下载 Download Jython 2.7.0 - Standalone Jar 包,放到jmeter/lib/目录下,重启jmeter,就能在sampler中找到JSR223 Sampler,里面就有python,但是,是python2.7,所以,对我没啥用

2. jmeter-functions-execute-python-script-1.0.jar,网上有个这个包,可以从函数助手那边进去执行python脚本,试了下失败了,就不介绍了,有兴趣可以百度下咋弄

3OS Process Sampler,使用这个组件可以执行脚本,后面着重介绍这个,使用了下,很强的组件,理论上,只要你脚本能力强,可以获得各种想要的(终于看到摆脱java的希望了。。)

OS Process Sampler

这个组件可以用来启动一个可执行程序,由于是通过命令行方式启动,所以我们可以用任何语言编写一个测试用的可执行程序(比如Linux的sh脚本)。在该可执行程序中调用我们的接口,并把返回的原始数据输出而交由JMeter做后续解析判断。

位置:/sampler/OS Process Sampler
这个组件有几栏:

1
2
3
4
command: 可执行文件(windows系统建议放.bat脚本或exe文件,linux系统放shell;干过windows下放了shell直接报非可执行文件。。)

working directory:工作目录,默认是jmeterbin 目录,可指定
command parameters:参数,如果脚本需要传参,可在这边传

 

既然这个组件可以执行bat文件,那我们在bat文件里面再调python文件不就实现了嘛~

加密实现

前面说了,思路就是使用OS Process Sampler来调用.bat文件,然后在.bat文件中再调python文件,实现加密,脚本如下:

jmeter

OS Process Sampler中:

1
2
3
4
command: oss.bat路径

working directory:默认
command parameters:secret,userName,tenant(三个传参,方便参数化)

 

同时,在OS Process Sampler后追加三个正则表达式提取器,分别获取时间戳随机数签名

正则表达式提取器:

1
2
3
4
引用名称:sign
正则表达式:sign:(.+?)<>
模板:$1$
匹配数字: 1

 

时间戳和随机数相同方式获取

oss.bat

oss.bat:

1
2
3
4
5
6
@echo off
set secret = %1
set userName = %2
set tenant = %3

python  E:py_workspacehashtestJmeterSSTest.py  %*

 

Windows批处理文件,首先获取传进去的三个参数,再将这三个参数作为入参传给python脚本

JmeterSSTest.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
# -*-coding: utf-8 -*-
"""
@author: kyle
@time: 2019/4/23 12:44
"""
import hashlib
import hmac
import time
import random
import sys

# 定义传参,按顺序,secret,userName,tenant
secret = sys.argv[1]
userName = sys.argv[2]
tenant = sys.argv[3]

# 获取当前时间戳
timestamp = int(time.time())

# 获取随机数
randoms = random.randint(0, 999999999)

# 获取sign
strsign = str(u'tenant' + str(tenant) + u'userName' + str(userName) + u'tenant' + str(tenant) +
               u'timestamp' + str(timestamp) + u'randoms' + str(randoms))

# hmacsha256加密
intsign = hmac.new(bytes(str(secret), encoding='utf-8'), bytes(str(strsign), encoding='utf-8'),
                    digestmod=hashlib.sha256).digest()

# 二进制转义
sign = intsign.hex()

print(u'timestamp' + ':' + str(timestamp) + '<>')
print(u'randoms' + ':' + str(randoms) + '<>')
print(u'sign' + ':' + str(sign) + '<>')

脚本就不解释了,不难

完整jmeter结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 获取token接口(简单控制器)
	-- http信息头管理器
    -- http请求
    -- 响应断言
    --查看结果树
    -- JSON Extractor
-- 加密sign
   -- OS Process Sampler
     -- 正则提取 timestamp
     -- 正则提取 randoms
     -- 正则提取 sign
-- 获取用户接口
   -- http信息头管理器
   -- http请求
   -- 查看结果树
   -- 响应断言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章