好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python实现接口测试中需要对请求参数进行hmac的运算

参数由公共参数和接口参数构成,公共参数是每个接口都要带的,接口参数是根据接口不同而不同

公共参数如下:

  

 接口参数:

签名生成的通用步骤如下( 以HMAC算法举例 ):

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序);

◆ 如果参数的值为空不参与签名,且请求报文中也不要带此参数;

◆ 参数名区分大小写;

第二步,对stringA对进行 HMAC 运算,得到hmac的值后再做Base64编码,最后得到sign值signature。

 ◆ key由BJCA颁发给用户;

举例:

假设传送的参数如下:

appId: 10002

deviceId: 1000

mobile: 18611525990

signAlgo:  HmacSHA256

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA=“appId=1000&deviceId=1000&mobile =18611525990&signAlgo=HMAC”;

第二步:计算sign:

stringSignTemp=hmac(stringA,key)

signature=Base64(stringSignTemp) 

Python脚本如下:

import requests
import json,hmac,base64
from hashlib import sha256
header = {'content-type':'application/json'}
url = r'http://ip:port/urlpath'
reqBody = {
    "appId": "APP_60924EAB150441E79280F240769C27D2",
    "deviceId": "DEV_C42F9FCEE6304F64A14C8016F78663AD",
    "signAlgo": "HMAC",
    "bussinessId": "{{bussinessId}}",
    "version": "1.0",
    "name": "xxxxx",
    "idNumber": "xxxx",
    "mobile":"xxx"
}

#对参数进行排序,
str1 = ''
s1 = sorted(list(reqBody.keys()))
for i in s1:
str1 = f'{str1}&{i}={reqBody[i]}'

#s2为最终排序结果
s2 = str1[1:].encode('utf-8')
secret = 'mLA6Aoyx7KzPaEtri6X1qYYCYZXvSxIV'.encode('utf-8')

#进行hmac
x = hmac.new(secret,s2,digestmod=sha256).digest()
#进行base64编码
signature = base64.b64encode(x)
reqBody['signature'] = signature.decode('utf-8')
res = requests.post(url=url,headers=header,data=json.dumps(reqBody))
print(res.json())

查看更多关于python实现接口测试中需要对请求参数进行hmac的运算的详细内容...

  阅读:24次