
本文介绍如何使用字典持久化存储密钥及其对应过期时间,实现“首次验证即启动倒计时”的精准过期控制,支持批量密钥管理,避免每次运行都重置有效期。
本文介绍如何使用字典持久化存储密钥及其对应过期时间,实现“首次验证即启动倒计时”的精准过期控制,支持批量密钥管理,避免每次运行都重置有效期。
在实际开发中(如许可证校验、临时访问令牌等场景),密钥的过期逻辑不应依赖生成时刻,而应以首次成功验证时间为起点——这正是原代码的核心缺陷:generate_key() 每次调用都生成新过期时间,且未持久化记录;同时 if expiration_time == timedelta: 等判断逻辑存在类型错误,导致失效检测完全失效。
正确做法是:将密钥与它的过期时间作为键值对存入字典(如 key_expiration_map),后续每次输入都查表验证,既保证单密钥生命周期独立,又支持多密钥共存管理。
以下是优化后的完整实现:
from datetime import datetime, timedelta
# 全局字典:存储「密钥 → 过期时间」映射
key_expiration_map = {}
def generate_key(key_str: str = "4255", minutes: int = 1) -> str:
"""生成密钥并注册其过期时间(仅首次注册有效)"""
if key_str not in key_expiration_map:
expiration_time = datetime.now() + timedelta(minutes=minutes)
key_expiration_map[key_str] = expiration_time
print(f"# Registered key '{key_str}' with {minutes}-minute expiry")
return key_str
def is_expired(expiration_time: datetime) -> bool:
"""判断指定过期时间是否已到达"""
return datetime.now() > expiration_time
def validate_key(user_input: str) -> bool:
"""验证用户输入的密钥是否有效且未过期"""
if user_input not in key_expiration_map:
print("❌ Invalid Key")
return False
expiration_time = key_expiration_map[user_input]
if is_expired(expiration_time):
print("❌ Key Expired")
return False
else:
print("✅ Successfully Loaded")
print(f"⏳ Expires at: {expiration_time.strftime('%Y-%m-%d %H:%M:%S')}")
return True
# 示例:预注册多个密钥(可扩展为从文件/数据库加载)
generate_key("4255", minutes=1) # 1分钟过期
generate_key("X9A2", minutes=5) # 5分钟过期
generate_key("TEST", minutes=30) # 30分钟过期
print("\n? License Key Validator (Ctrl+C to exit)")
while True:
try:
user_input = input("\nEnter your license Key: ").strip()
if not user_input:
continue
if validate_key(user_input):
break
except KeyboardInterrupt:
print("\n? Exiting...")
break
✅ 关键改进说明:
- 首次验证即锁定过期时间:generate_key() 仅在密钥未注册时写入字典,确保 4255 的过期时间从第一次运行起固定不变;
- 多密钥支持:轻松通过多次调用 generate_key("X9A2", 5) 注册不同密钥及差异化有效期;
- 健壮性增强:添加空输入过滤、异常捕获(KeyboardInterrupt)、格式化时间输出;
- 可扩展设计:key_expiration_map 可替换为 Redis、SQLite 或 JSON 文件,实现跨进程/重启持久化。
⚠️ 注意事项:
- 当前实现中字典数据仅驻留在内存,程序退出后丢失。如需长期有效,请改用 json.dump() 写入文件,或接入 Redis(推荐用于生产环境);
- 生产环境中应增加密钥加密、防暴力尝试(如失败次数限制)、时间同步校验(防止客户端篡改系统时间)等安全措施。
通过该方案,你不仅能精准控制每个密钥的生命周期,还能灵活扩展至成百上千个动态密钥的统一过期管理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











