背景:
测试接口的时候,一般会有一个参数(如:sign)是对请求参数名及值按一定规则生成的加密串,后台会对接口请求的加密串做校验,如果对可以正常请求接口,如果不对就给与提示验签错误之类。(类似于登录的密码)
解决方案:
- 给研发要生成规则的包,导入到你的项目,你的参数也按包里的方法生成加密串
- 让研发对几个固定的数据不验证加密串,你用固定的参数进行测试
- 自己写一套和研发规则一样的代码,接口请求的时候调用自己写好的方法
研发使用的java语言,我使用的python语言,使用上面第三种方法比较适合,步骤如下:
1.写一套和后台规则一样的加密串方法
import hashlib
class md5Python(object):
"""MD5签名和验签"""
@classmethod
def data_processing(cls, data):
"""
:param data: 需要签名的数据,字典类型
:return: 处理后的字符串,格式为:参数名称=参数值,并用&连接
"""
if "sign" in data:
del data["sign"]
dataList = []
for key in sorted(data):
if data[key] and key!= "imgData":
dataList.append("%s=%s" % (key, data[key]))
return "&".join(dataList).strip()
@classmethod
def md5_sign_str(cls, data, api_key):
"""
MD5签名的完整字符串
:param data: 需要签名的数据,字典类型
:param api_key: MD5签名需要的字符串
:return: 处理后的字符串,格式为:参数名称=参数值,并用&连接,最后用&连接'key=api_key'
"""
data = cls.data_processing(data) + '&key=' + api_key.strip()
return data
@classmethod
def md5_sign(cls, data, api_key):
"""
MD5签名
:param api_key: MD5签名需要的字符串
:return: 签名后的字符串sign
"""
data = cls.data_processing(data) + '&key=' + api_key.strip()
md5 = hashlib.md5()
md5.update(data.encode(encoding='UTF-8'))
return md5.hexdigest()
@classmethod
def md5_verify(cls, data, signature):
"""
md5验签
:param data: 接收到的数据
:param signature: 接收到的sign
:return: 验签结果,布尔值
"""
if cls.md5_sign(data) == signature:
return True
else:
return False
2.测试同样信息自己代码生成加密串是否和后台的一致
# -*- coding:utf-8 -*-
from md5_python import md5Python
param = {
'c':'ccccccccc',
'd':'ddddddddd',
'e':'eeeeeeeee'
}
key = 'kkkkkkkkkk'
print('加密参数:' + md5Python.data_processing(param))
print('加密的完整请求串:' + md5Python.md5_sign_str(param,key))
print('加密生成的sign:' + md5Python.md5_sign(param,key))
print('请求信息:' + md5Python.md5_sign_str(param,key)+'&sign='+md5Python.md5_sign(param,key))
3.进行接口测试,sign值调用上面方法生成进行请求
# -*- coding:utf-8 -*-
import requests
from md5_python import md5Python
# 基本地址
base_url = 'http://*******'
# 接口请求参数
param = {
'c':'ccccccccc',
'd':'ddddddddd',
'e':'eeeeeeeee'
}
# 用于生成验签的唯一值
key="kkkkkkkkkk"
if __name__ == '__main__':
print('加密的完整请求串:' + md5Python.md5_sign_str(param, key))
print('加密生成的sign:' + md5Python.md5_sign(param, key))
param["sign"] = md5Python.md5_sign(param, key)
# 打印请求参数
print('请求参数为:' + str(param))
# 调用接口
r = requests.post(base_url + '/***', data=param)
# 打印返回参数
print('返回参数为: ' + r.text)
网友评论