
本文介绍如何使用字典存储密钥与其对应的动态过期时间,确保每个密钥仅在首次验证时启动倒计时(如1分钟),后续验证基于该初始时间判断是否过期,避免重复生成导致“永不超时”问题。
本文介绍如何使用字典存储密钥与其对应的动态过期时间,确保每个密钥仅在首次验证时启动倒计时(如1分钟),后续验证基于该初始时间判断是否过期,避免重复生成导致“永不超时”问题。
在实际开发中(如软件许可、API临时凭证、测试密钥管理),我们常需为不同密钥设置独立且不可重置的过期逻辑:密钥的生命周期应从首次成功验证时刻开始计算,而非每次运行程序或每次输入时重新生成新过期时间。原始代码的问题在于:generate_key() 每次调用都产生新的 expiration_time,且未持久化存储;同时 if expiration_time == timedelta: 等条件逻辑错误(timedelta 是类型,不是实例),导致过期判断失效。
正确做法是:使用字典(dict)作为内存级键值存储,以密钥为 key,以首次生成的 datetime 对象为 value。这样,同一密钥多次输入时,始终复用同一个过期时间戳,真正实现“首次使用即锁定有效期”。
以下是优化后的完整实现:
from datetime import datetime, timedelta
# 全局字典:存储「密钥 → 首次生成的过期时间」映射
key_expiration_map = {}
def generate_key():
"""生成固定密钥及对应1分钟后过期时间(仅用于演示,生产中建议随机生成)"""
key = "4255"
# 注意:此处 expiration_time 是绝对时间点(如 2024-06-15 14:30:25),非相对时长!
expiration_time = datetime.now() + timedelta(minutes=1)
return key, expiration_time
def is_expired(expiration_time):
"""判断指定过期时间是否已到达"""
return datetime.now() > expiration_time
def validate_key(user_input):
"""
验证用户输入的密钥:
- 若密钥不存在 → 无效密钥
- 若存在但已过期 → 提示过期
- 若存在且未过期 → 验证通过,显示剩余有效期
"""
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:
remaining = expiration_time - datetime.now()
print("✅ Successfully Loaded")
print(f"⏰ Expiration (remaining): {int(remaining.total_seconds())} seconds")
return True
# 初始化:生成密钥并注册其首次过期时间(仅执行一次!)
correct_key, first_expiration = generate_key()
key_expiration_map[correct_key] = first_expiration
print(f"# Generated key: {correct_key}")
print(f"# Will expire at: {first_expiration.strftime('%Y-%m-%d %H:%M:%S')}")
# 持续接收输入,直到验证成功
while True:
user_input = input("Enter your license Key: ").strip()
if validate_key(user_input):
break
input("Press any key to close...")
✅ 关键改进说明:
- 首次绑定,终身有效:key_expiration_map[correct_key] = first_expiration 保证该密钥的过期时间在程序启动时仅设定一次;
- 精准过期判断:is_expired() 基于 datetime.now() 与存储的绝对时间比较,毫秒级准确;
- 可扩展性强:轻松支持多密钥(如 key_expiration_map.update({"ABC123": dt1, "XYZ789": dt2}));
- 清晰反馈:显示剩余秒数,便于调试与用户体验。
⚠️ 注意事项:
- 当前方案将数据存在内存中,程序退出后丢失。如需持久化,请改用 json 文件、SQLite 或 Redis(推荐用于生产环境);
- 生产环境中密钥不应硬编码(如 "4255"),而应通过安全方式生成(如 secrets.token_urlsafe(16))并加密存储;
- 若需支持“每次使用刷新过期时间”,则需在 validate_key() 中更新 key_expiration_map[user_input] —— 但本例明确要求“首次使用即锁定”,故不采用。
通过该模式,你不仅能解决单密钥反复刷新的问题,更构建了可横向扩展的轻量级密钥生命周期管理基础框架。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











