Python加密(MD5)接口参数生成sign
API签名
为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,TOP服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。TOP目前支持的签名算法有: MD5(本接口通用参数里面sign_method的值为md5),签名大体过程如下:
对所有API请求参数(包括公共参数和业务参数,但除去sign参数和byte[]类型的参数),根据参数名称的ASCII码表的顺序排序。如: foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是bar=2, foo=1, foo_bar=3, foobar=4。
将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:bar2foo1foo_bar3foobar4
把拼装好的字符串采用utf-8编码,使用签名算法对编码后的字节流进行摘要。如果使用MD5算法,则需要在拼装的字符串前后加上app的secret后,再进行摘要,如:md5(secret+bar2foo1foo_bar3foobar4+secret)
将摘要得到的字节流结果使用十六进制表示,如: hex(“helloworld”.getBytes(“utf-8”)) = “68656C6C6F776F726C64”
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
算法步骤
一、接口的请求的参数(包括共同参数)进行组合
二、将参数进行ASCll排序
三、将参数拼接为一个字符串
四、字符串进行MD5加密
def ascll_sort(requests_parm):
"""ASCll码排序"""
def sort(param):
"""param参数做处理"""
return requests_parm(sorted(param.items()))
return sort
@ascll_sort
def format_parameter(sort_date):
"""
拼接参数
:param sort_data: 装饰器返回的参数
:return: 所有参数拼成一个字符串
"""
arr =[]
for data in sort_date:
for a in data:
parameter = ''.join(str(a))
arr.append(parameter)
param = appSecret + ''.join(arr) + appSecret
return param
def md5_sign(format_parameter):
"""
MD5数据加密
:param encrypt: format_parameter返回的字符串
:return: 返回32位 16进制 大写
"""
def str_md5(param):
md5 = hashlib.md5()
md5.update(param.encode())
sign= md5.hexdigest()
return format_parameter(sign.upper())
return str_md5
@md5_sign
def sign(sign):
"""请求URL"""
md5_sign ={
'sign':sign
}
return md5_sign
请求接口示范
def request_url(parm, sign):
data = dict(parm, **sign)
response= requests.get(url, data)
print(response.json())
if __name__ == '__main__':
requests_data = get_access_token() # get_access_token接口请求参数
str_data = format_parameter(requests_data) # 所有参数格式化成字符串
requests_sign = sign(str_data) # 加密MD5 变成sign
request_url(requests_data, requests_sign)