1、sign签名:用于提供给外部(第三方)调用的接口,调用方需提供正确的appkey才能调用,确保接口的安全性。
 A公司给B公司开发了一个接口,那么A公司给B公司一个sign签名,确保数据的安全。
 客户端:当用户请求服务前,会定义请求参数,通过这些参数,生成相应的sign签名,生成之后,传给服务器。
 服务端:接收传过来的请求数据,先根据传过来的参数,生成sign签名,之后与客户端传来的sign签名进行一个比对,如果两个sign签名一致,则允许访问服务器数据,否则禁止访问。


2、 sign签名的加密方法:
 (1 将所有的参数去除sign本身以及值为空的参数
 (2 将以上的的参数按照字母升序排序
 (3 将排序后的参数按照:参数1值1参数2值2……拼接成一个字符串
 (4 将秘钥拼接在字符串后面
 (5 将以上字符全部换成小写,通过md5计算加密,得到sign值
 (6 将这个值传到服务器,服务器进行解码,识别这个值是否是我们要传的请求,如果是,则返回值。

# 举个栗子:一个请求的body参数为以下:,提供的apikey为123456
# body = {
#     "username":"test",
#     "password":"123456",
#     "mail":"",
#     "sign":"签名后的值"
# }

 接下来使用python实现签名

def jiami(apikey,body):
    # 1、去除值为空以及sign值的参数
    list=[]
    for i in body.items():
        # print(i) 遍历出来的是元组('username', 'test')。
        if i[0]!='sign' and i[1]!='':
            list.append("".join(i)) # 将遍历出来的元组进行拼接。
    print('去除值为空以及sign值的参数后的list:%s'%list)

    # 2、 将以上的的参数按照字母升序排序
    list.sort() # 默认为升序排序,sort返回结果是一个list
    print('参数按照字母升序排序的list:%s'%list)

    # 3、将排序后的参数按照:参数1值1参数2值2……拼接成一个字符串
    list_a="".join(list)
    print('拼接后返回的新的字符串:%s' % list_a)

    # 4、 将秘钥拼接在字符串后面
    result = list_a + apikey
    print('秘钥拼接在字符串后的结果:%s' % result)

    # 5、将以上字符全部换成小写,通过md5计算加密
    import hashlib
    def jiamind5(src):  # 函数嵌套一个函数
        m = hashlib.md5() # 创建一个对象
        m.update(result.encode('UTF-8'))
        return m.hexdigest()
        # print(sign)

    sign = jiamind5(src='result')
    print(sign)
    # 得到sign签名后的新的body值
    body['sign'] = sign  # 将sign值更新到body
    print(body)

if __name__=='__main__':
    apikey = "123456"  # 秘钥,由开发提供
    body = {  # 这是我们要传的参数
        "username": "test",
        "password": "123456",
        "mail": "",
        "sign": "签名后的值"
    }
    jiami(apikey, body)

输出结果为:

python中signal函数 python sign函数_服务器