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