MACSHA256加密生成签名

再水一篇,也是业务测试中遇到的一种加密方式,这里示例就直接使用相同的加密规则了,可以根据业务场景自行调整加密前字符串

加密规则

  所有API的请求参数(除去Sign参数),参数名转小写后根据参数名称的AscII表顺序排序;   

  将排序号的参数名和参数值拼装在一起得到新的字符串A;   

  注:非Get请求,需要把body的值也拼接过去,把body内容作为一个参数值,参数名为 body,参与排序;

  使用HMACSHA256对上述拼接出来的字符串A进行摘要计算 GetHMACSHA256(A,A对应的秘钥);   

  得到Sign签名后即可正常发起请求

示例代码

import hmac
import hashlib
import common.sdkapi_sign
import json
import re


def com_sign(method, Appkey=None, data=None, body=None):
    """
    使用直接调用这个函数即可
    :param request:请求方式(get、post)
    :param Appkey: 签名key
    :param data: 请求参数
    :param body: 请求体
    """
    if method == 'GET':
        sign = common.sdkapi_sign.Sign.signs(Appkey, common.sdkapi_sign.Sign.ascii(data))
        # 生成的签名添加到加入请求参数
    elif method == 'POST':
        # 将body字典对象转为字符串并且替换为双引号
        body_json = json.dumps(body).replace("'", '"')
        # 去除空格
        body_json = re.sub(r"\s", "", body_json)

        # print(body_json)
        data['body'] = body_json
        # 根据入参生成签名
        sign = common.sdkapi_sign.Sign.signs(Appkey, common.sdkapi_sign.Sign.ascii(data))
    else:
        print("请求方式不正确")
        sign = None
    return sign


class Sign:
    # 标记静态方法
    @staticmethod
    # 将请求参数排序生成字符串
    def ascii(data):
        # 转化为小写参数名
        params = {k.lower(): v for k, v in data.items()}

        # 按照ASCII码顺序排序
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        # print('排序后--%s' % sorted_params)

        # 拼接参数成字符串
        params_str = "&".join(["{}={}".format(k, v) for k, v in sorted_params])
        # print('拼接字符串--%s' % params_str)

        return params_str

    # 标记静态方法
    @staticmethod
    # 根据appkey加密生成sign
    def signs(appkey, strToSign):
        # hmac_sha256加密入参
        s = hmac.new(bytes(appkey, encoding='utf-8'), bytes(strToSign, encoding='utf-8'),
                     digestmod=hashlib.sha256).hexdigest().lower()
        # print('签名--%s' % s)
        return s

 

posted @ 2024-06-03 20:33  CAI_11  阅读(72)  评论(0)    收藏  举报