Python 接口验签测试

部署运行你感兴趣的模型镜像

最近有新的接口要上线,测试通过需满足以下条件:

1、身份认证 2、验签(防篡改、防重放)3、输入 处理 输出等。

身份认证使用SSO,直接pass,我们重点放在验签:

参数签名:

将所有参数key的首字母按照accii 从小到大排列 (一对参数的key和value用=号连接,两个参数之间用&连接)拼接,例如:username=secguard&password=whoami_123!,拼接完成后的对整个字符串进行转小写,然后尾部加上&signkey=签名的key,最后将字符串用MD5加密生成:signature

python刚开始接触,不太习惯:

# coding = utf8
import requests
import json  
import hashlib
import datetime
url = "http://apitest/supervise/manage/searchInfo"

headers = {"Content-Type":"application/json","User_Agent":"sec_test"}
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #获取当前日期

data = {
	"accessToken": "efd22965-2d92-46dp-9fa0-17192344a252", #认证后的授权token
	"signtime": now_time, #时间错
	"cardId": "114"
}

keys = []
for key in data:
	keys.append(key)

keys = sorted(keys)  #参数首字母Ascii升序
aa=[]
for key in keys:
	if isinstance(data[key],int):
		data[key]= str(data[key])
	aa.append(key+'='+data[key])

#print(" ASCII", ord('a'),ord('k'),ord('p'),ord('c'),ord('s'))
str=''
index=0
for s in aa:
	index=index+1
	if index == len(aa):
		str = str+s
	else:
		str = str+s+'&'

str1 = str.lower()+"&signkey=tSPRGaUQg9LUHJdoklKf9XbOs4SlTsaor"
signature = hashlib.md5(str1.encode("utf-8")).hexdigest() #对参数拼接后进行md5

data.update({"signature":signature}) #验签字符串加入参数字典
"""
最后生成的请求体json如下:
data = {
	"accessToken": "efd22965-2d92-46dp-9fa0-17192344a252",
	"signtime": now_time,
	"cardId": "114",
    "signature":signature
}
"""
res = requests.post(url=url,data=json.dumps(data),headers=headers)
print(json.loads(res.text))

#print(res.text)

 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

接口测试中,证是一种常见的安全机制,用于防止非法请求和数据篡改。处理证的关键在于理解名的生成规则,并在测试工具中模拟该过程,以生成合法的请求。 名通常由请求中的业务参数按照特定规则排序后,加上一个安全密钥(如 `secretKey` 或 `appKey`),再通过加密算法(如 MD5、SHA1、HMAC-SHA256 等)生成。服务端在接收到请求后,会使用相同的规则和密钥重新生成名,并与请求中的名字段进行比对,若一致则证通过。 ### 常见名生成方式 名字段 `sign` 的生成方式通常包括以下几个步骤: 1. **参数排序**:将所有业务参数按照参数名进行字典序排列。 2. **拼接参数**:将参数名和对应的值按照一定格式拼接成字符串,例如 `param1=value1&param2=value2`。 3. **添加密钥**:在拼接好的字符串末尾或指定位置添加安全密钥。 4. **加密生成名**:使用 MD5、SHA1、HMAC-SHA256 等加密算法生成名值。 5. **传递名**:将生成的名作为 `sign` 参数附加在请求中。 例如,使用 MD5 加密生成名的 Python 示例: ```python import hashlib def generate_sign(params, secret_key): # 对参数按字母顺序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 拼接参数字符串 param_str = '&'.join([f"{k}={v}" for k, v in sorted_params]) # 添加密钥 sign_str = param_str + secret_key # 生成 MD5 名 sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest() return sign # 示例参数 params = { 'timestamp': '1672531199', 'nonce': '123456', 'action': 'create_order' } secret_key = 'your_secret_key' sign = generate_sign(params, secret_key) print("生成的名:", sign) ``` ### 在 JMeter 中处理证 在 JMeter 中进行接口测试,可以使用 **JSR223 Sampler** 或 **BeanShell** 脚本动态生成名。以下是一个使用 Groovy 脚本生成 MD5 名的示例: ```groovy import java.security.MessageDigest def params = [:] params['timestamp'] = vars.get("timestamp") params['nonce'] = vars.get("nonce") params['action'] = vars.get("action") def secretKey = "your_secret_key" // 按键排序 def sortedParams = params.sort { a, b -> a.key.compareTo(b.key) } // 拼接参数字符串 def paramStr = sortedParams.collect { k, v -> "$k=$v" }.join('&') // 添加密钥并生成 MD5 def digest = MessageDigest.getInstance("MD5") digest.update((paramStr + secretKey).getBytes('UTF-8')) def md5sum = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0') // 将生成的名存入变量供后续请求使用 vars.put("sign", md5sum) ``` 在 JMeter 测试计划中,可将上述脚本嵌入到 **JSR223 PreProcessor** 中,在请求发送前动态生成名值,并将其插入到请求参数中。 ### 证的注意事项 - **密钥安全**:确保名所用的密钥不被泄露,测试环境中应使用测试专用密钥。 - **间戳证**:部分系统要求名中包含间戳,并证请求是否在有效间内,避免重放攻击。 - **参数完整性**:名生成过程中应确保所有参与名的参数都被正确处理,避免遗漏或多余参数影响结果。 - **编码一致性**:注意参数值的编码方式(如 UTF-8),确保服务端与客户端编码一致,避免因编码差异导致名不一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值