import base64 import hashlib import time from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import padding def generate_signature(method, url, body, app_id, private_key_path): method_str = method.upper() url_str = url timestamp = str(int(time.time())) nonce_str = hashlib.md5(timestamp.encode()).hexdigest() body_str = body to_sign = f"{method_str}\n{url_str}\n{timestamp}\n{nonce_str}\n{body_str}" with open(private_key_path, "rb") as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) signature = private_key.sign( to_sign.encode(), padding.PKCS1v15(), hashes.SHA256() ) signature_base64 = base64.b64encode(signature).decode() auth_header = f"TAMS-SHA256-RSA app_id={app_id},nonce_str={nonce_str},timestamp={timestamp},signature={signature_base64}" return auth_header