You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.4 KiB
69 lines
1.4 KiB
#! /usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# Date: 2018/8/2
|
|
|
|
import json
|
|
import time
|
|
import uuid
|
|
|
|
from Crypto.Signature import PKCS1_v1_5
|
|
from Crypto.Hash import SHA256
|
|
|
|
from base64 import encodebytes
|
|
from base64 import decodebytes
|
|
|
|
|
|
def format_params(params):
|
|
"""格式化参数
|
|
|
|
"""
|
|
return sorted(
|
|
((k, v if not isinstance(v, dict) else json.dumps(v, separators=(',', ':'))) for k, v in params.items())
|
|
)
|
|
|
|
|
|
def verify_signature(params, api_key):
|
|
"""验证签名
|
|
|
|
"""
|
|
|
|
sign = params.pop("sign", "")
|
|
|
|
if "sign_type" in params:
|
|
params.pop("sign_type")
|
|
|
|
# 针对字符串进行排序
|
|
ordered_items = format_params(params)
|
|
message = "&".join(u"{}={}".format(k, v) for k, v in ordered_items)
|
|
# 验签
|
|
signer = PKCS1_v1_5.new(api_key)
|
|
digest = SHA256.new()
|
|
digest.update(message.encode("utf8"))
|
|
if signer.verify(digest, decodebytes(sign.encode("utf8"))):
|
|
return True
|
|
return False
|
|
|
|
|
|
def calculate_signature(params, api_key):
|
|
"""计算签名
|
|
|
|
"""
|
|
signer = PKCS1_v1_5.new(api_key)
|
|
signature = signer.sign(SHA256.new(params))
|
|
# base64 编码,转换为unicode表示并移除回车
|
|
sign = encodebytes(signature).decode("utf8").replace("\n", "")
|
|
return sign
|
|
|
|
|
|
def get_uuid():
|
|
"""获取 `UUID`
|
|
|
|
"""
|
|
return str(uuid.uuid4())
|
|
|
|
|
|
def get_iso_8061_date():
|
|
"""获取 `iso` 标准时间
|
|
|
|
"""
|
|
return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
|
|
|