HMACValidatorObject.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import hmac
  2. import hashlib
  3. import base64
  4. from datetime import datetime
  5. class HMACValidatorObject:
  6. def __init__(self):
  7. """
  8. 初始化HMAC签名与验签类。
  9. """
  10. secret = "4f92e6aa7e231ea8b9c"
  11. self.secret = secret.encode('utf-8')
  12. def sign(self, data):
  13. """
  14. 使用共享密钥对数据进行签名。
  15. :param data: 需要签名的字符串数据
  16. :return: 返回签名的base64编码字符串
  17. """
  18. signature = hmac.new(self.secret, data.encode('utf-8'), hashlib.sha256).digest()
  19. return base64.b64encode(signature).decode('utf-8')
  20. def verify(self, data, provided_signature):
  21. """
  22. 使用共享密钥对签名进行验证。
  23. :param data: 原始字符串数据
  24. :param provided_signature: 请求中提供的签名 (base64编码)
  25. :return: 验签结果,True表示签名有效,False表示签名无效
  26. """
  27. expected_signature = self.sign(data)
  28. return hmac.compare_digest(expected_signature, provided_signature)
  29. @staticmethod
  30. def generate_timestamp():
  31. """
  32. 生成当前时间戳,用于防止重放攻击。
  33. :return: 当前时间的ISO格式字符串
  34. """
  35. return datetime.utcnow().isoformat()
  36. @staticmethod
  37. def validate_timestamp(timestamp, tolerance_seconds=300):
  38. """
  39. 校验时间戳是否在允许的范围内。
  40. :param timestamp: Unix时间戳 (秒级)
  41. :param tolerance_seconds: 容许的时间误差,单位为秒 (默认5分钟)
  42. :return: 时间戳是否在有效范围内
  43. """
  44. try:
  45. # 将Unix时间戳转为datetime对象
  46. request_time = datetime.utcfromtimestamp(int(timestamp))
  47. current_time = datetime.utcnow()
  48. # 计算时间差(秒级)
  49. delta = (current_time - request_time).total_seconds()
  50. # 判断时间差是否在容许范围内
  51. return abs(delta) <= tolerance_seconds
  52. except ValueError:
  53. return False