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: Unix时间戳 (秒级)
        :param tolerance_seconds: 容许的时间误差，单位为秒 (默认5分钟)
        :return: 时间戳是否在有效范围内
        """
        try:
            # 将Unix时间戳转为datetime对象
            request_time = datetime.utcfromtimestamp(int(timestamp))
            current_time = datetime.utcnow()
            # 计算时间差（秒级）
            delta = (current_time - request_time).total_seconds()
            # 判断时间差是否在容许范围内
            return abs(delta) <= tolerance_seconds
        except ValueError:
            return False
