Jmeter调用python完成HmacSHA256加密处理

Jmeter调用python完成HmacSHA256加密处理

前言

同事有个需求,一个获取人员信息的接口,请求头里面需要有一个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脚本,试了下失败了,就不介绍了,有兴趣可以百度下咋弄

3. OS 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_workspace\hashtest\JmeterSSTest.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
38
#!/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请求
-- 查看结果树
-- 响应断言

以上,完~

文章目录
  1. 前言
  2. jmeter方案
    1. jmeter中使用python脚本
    2. OS Process Sampler
  3. 加密实现
    1. jmeter
    2. oss.bat
    3. JmeterSSTest.py
  4. 完整jmeter结构
|