MACSHA256加密生成簽名

CAI_11發表於2024-06-03

再水一篇,也是業務測試中遇到的一種加密方式,這裡示例就直接使用相同的加密規則了,可以根據業務場景自行調整加密前字串

加密規則

  所有API的請求引數(除去Sign引數),引數名轉小寫後根據引數名稱的AscII表順序排序;   

  將排序號的引數名和引數值拼裝在一起得到新的字串A;   

  注:非Get請求,需要把body的值也拼接過去,把body內容作為一個引數值,引數名為 body,參與排序;

  使用HMACSHA256對上述拼接出來的字串A進行摘要計算 GetHMACSHA256(A,遊戲對應的秘鑰);   

  得到Sign簽名後即可正常發起請求

示例程式碼

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


def com_sign(request, Appkey=None, data=None, body=None):
    """
    使用直接呼叫這個函式即可
    :param request:請求方式(get、post)
    :param Appkey: 簽名key
    :param data: 請求引數
    :param body: 請求體
    """
    if request == 'get':
        sign = common.sdkapi_sign.Sign.signs(Appkey, common.sdkapi_sign.Sign.ascii(data))
        # 生成的簽名新增到加入請求引數
    elif request == '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

相關文章