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

您所在的位置:网站首页 jmeter处理加密接口 Jmeter调用python完成HmacSHA256加密处理【转载】

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

2023-09-15 23:23| 来源: 网络整理| 查看: 265

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

 

请求头:

keyvalueAuthorizationBearer ${token}content-typeapplication/jsontenanttesttenanttimestamp当前时间戳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_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请求 -- 查看结果树 -- 响应断言


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3