import hmac import hashlib import base64 from datetime import datetime class HMACValidatorObject: def __init__(self): """ 初始化HMAC签名与验签类。 """ secret = "4f92e6aa7e231ea8b9c" self.secret = secret.encode('utf-8') def sign(self, data): """ 使用共享密钥对数据进行签名。 :param data: 需要签名的字符串数据 :return: 返回签名的base64编码字符串 """ signature = hmac.new(self.secret, data.encode('utf-8'), hashlib.sha256).digest() return base64.b64encode(signature).decode('utf-8') def verify(self, data, provided_signature): """ 使用共享密钥对签名进行验证。 :param data: 原始字符串数据 :param provided_signature: 请求中提供的签名 (base64编码) :return: 验签结果,True表示签名有效,False表示签名无效 """ expected_signature = self.sign(data) return hmac.compare_digest(expected_signature, provided_signature) @staticmethod def generate_timestamp(): """ 生成当前时间戳,用于防止重放攻击。 :return: 当前时间的ISO格式字符串 """ return datetime.utcnow().isoformat() @staticmethod def validate_timestamp(timestamp, tolerance_seconds=300): """ 校验时间戳是否在允许的范围内。 :param timestamp: 时间戳字符串 (ISO格式) :param tolerance_seconds: 容许的时间误差,单位为秒 (默认5分钟) :return: 时间戳是否在有效范围内 """ try: request_time = datetime.fromisoformat(timestamp) current_time = datetime.utcnow() delta = (current_time - request_time).total_seconds() return abs(delta) <= tolerance_seconds except ValueError: return False