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請求
   -- 查看結果樹
   -- 響應斷言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章