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.
 
 
 
 
 
 
flyapps/fir_ser/api/utils/ali/tools.py

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())