随记-探究 OpenApi 的加密方式

open api 主要参数如下

  • appKey 接口Key(app id)
  • appSecret 接口密钥
  • timeStamp 时间戳 毫秒
  • nonceStr 随机字符串
  • signature 加密字符串

客户端

  • 使用 appSecret 按照一定规则将 appKey timeStamp nonceStr 进行加密,得到密文 signature
  • 将 appKey timeStamp nonceStr 和 signature 一起上传

浅析

  • timeStamp 规定一个时间段,比如十分钟,防止暴力破解
  • nonceStr,防止冲重放攻击,需要服务端记录,并保证一段时间内不能再次使用

服务端

  • 根据 appKey 从数据库获取 appSecret
  • 按照和客户端相同的规则进行加密,得到密文,对比密文

小结

  • 客户端和服务端的加密方法相同
  • 本质上属于对称加密
  • 需要用户保管好密钥
import hashlib

class SignUtil(object):
    
    @staticmethod
    def create_sign(app_secret, **kwargs):

        temp_list = []
        for key, value in kwargs.items():
             
            if value not in (None, "") and key != "sign" and key != "key":
                temp_list.append(f"{key}={value}")
            
        temp_list.append(f"key={app_secret}")
        temp_str = ("&".join(temp_list)) .encode()

        sign = hashlib.md5(temp_str).hexdigest().upper()
        
        return sign


if __name__ == "__main__":
    
    # 用户端发起请求,生成签名后发送请求
    appSecret = "7214fefff0cf47d7950cb2fc3b5d670a"
    appId = "wx123456789"
    timestamp = "1583332804914"
    # 生成签名

    sorted_dict = {
        "appId":appId, 
        "timestamp":timestamp,
    }
    signature = SignUtil.create_sign(appSecret, appId=appId, timestamp=timestamp)
    print("签名:"+ signature )

    

到此结  DragonFangQy 2023.12.20

你可能感兴趣的:(python,加密,OpenApi)