machine_code.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """
  2. 机器码规范化:对 raw_machine_info 做统一解析与排序,使同一台机器在不同枚举顺序下得到相同 MD5。
  3. """
  4. import hashlib
  5. from typing import List
  6. def normalize_raw_machine_info(raw: str) -> str:
  7. """
  8. 规范化 raw_machine_info。
  9. 客户端格式:DISK=serial1;serial2;MAC=mac1;mac2(DISK 与 MAC 段内均为分号分隔)。
  10. 对两段内分号分隔的项分别排序后重组,使同一组硬件在不同顺序下得到相同字符串。
  11. """
  12. raw = (raw or "").strip()
  13. if not raw:
  14. return ""
  15. disk_part: List[str] = []
  16. mac_part: List[str] = []
  17. idx_mac = raw.find(";MAC=")
  18. idx_disk = raw.find("DISK=")
  19. if idx_disk >= 0 and idx_mac > idx_disk:
  20. disk_str = raw[idx_disk + 5 : idx_mac].strip() # 5 = len("DISK=")
  21. disk_part = [s.strip() for s in disk_str.split(";") if s.strip()]
  22. if idx_mac >= 0:
  23. mac_str = raw[idx_mac + 5 :].strip() # 5 = len(";MAC=")
  24. mac_part = [s.strip() for s in mac_str.split(";") if s.strip()]
  25. elif raw.upper().startswith("MAC="):
  26. mac_str = raw[4:].strip()
  27. mac_part = [s.strip() for s in mac_str.split(";") if s.strip()]
  28. if not disk_part and not mac_part:
  29. return raw
  30. disk_part.sort()
  31. mac_part.sort()
  32. parts = []
  33. if disk_part:
  34. parts.append("DISK=" + ";".join(disk_part))
  35. if mac_part:
  36. parts.append("MAC=" + ";".join(mac_part))
  37. return ";".join(parts)
  38. def raw_machine_info_to_machine_code(raw: str) -> str:
  39. """从 raw_machine_info 得到 machine_code(规范化后 MD5,与登录/心跳等逻辑一致)"""
  40. raw = (raw or "").strip()
  41. if not raw:
  42. return ""
  43. canonical = normalize_raw_machine_info(raw)
  44. return hashlib.md5(canonical.encode()).hexdigest()