本文介绍如何使用字典持久化存储密钥及其首次验证时生成的过期时间,确保每个密钥仅在首次输入后启动 1 分钟倒计时,避免重复生成导致“永不过期”问题,并支持批量密钥管理。
本文介绍如何使用字典持久化存储密钥及其首次验证时生成的过期时间,确保每个密钥仅在首次输入后启动 1 分钟倒计时,避免重复生成导致“永不过期”问题,并支持批量密钥管理。
在实际开发中(如软件许可、API 访问控制或临时凭证系统),密钥不应在生成时就固定过期时间,而应在首次成功验证时才激活其有效期——否则用户反复输入同一密钥会不断重置倒计时,失去时效管控意义。原始代码的问题在于:expiration_time 每次运行都重新生成,且未保存已验证密钥的状态,导致“4255”看似永远有效。
正确的做法是使用一个全局字典(如 key_expiration_map)作为轻量级内存数据库,以密钥为键、datetime 对象为值,记录每个密钥首次被接受时设定的绝对过期时刻。后续验证直接查表并比对当前时间即可。
以下是优化后的完整实现:
from datetime import datetime, timedelta
# 存储密钥与其首次激活后的过期时间(支持多密钥)
key_expiration_map = {}
def generate_key():
"""生成预设密钥(实际中可扩展为随机生成)"""
key = "4255"
# 注意:此处 expiration_time 是占位逻辑;真实场景中可生成多个不同密钥
return key
def is_expired(expiration_time):
"""判断指定过期时间是否已过期"""
return datetime.now() > expiration_time
def validate_key(user_input):
"""验证密钥:首次输入则注册过期时间,后续输入则校验时效"""
if user_input in key_expiration_map:
# 密钥已存在 → 检查是否过期
if is_expired(key_expiration_map[user_input]):
print("Key Expired")
return False
else:
print("Successfully Loaded")
print("Expiration:", key_expiration_map[user_input])
return True
else:
# 首次输入该密钥 → 绑定当前时间 + 1 分钟过期
if user_input == "4255": # 可替换为更灵活的白名单或签名校验
expiration_time = datetime.now() + timedelta(minutes=1)
key_expiration_map[user_input] = expiration_time
print("Key registered. Expires at:", expiration_time)
return True
else:
print("Invalid Key")
return False
# 启动流程
correct_key = generate_key()
print("# Generated key:", correct_key)
# 持续等待有效输入(模拟交互式授权)
while True:
user_input = input("Enter your license Key: ").strip()
if validate_key(user_input):
break
input("Press any key to close")
✅ 关键改进说明:
- 首次触发过期:密钥 "4255" 仅在第一次正确输入时才计算并存储 datetime.now() + timedelta(minutes=1),后续验证均基于此固定时间点判断;
- 多密钥扩展友好:字典结构天然支持任意数量密钥(如添加 "7890"、"1357" 等),只需在 validate_key() 中扩展校验逻辑;
- 状态隔离:每个密钥独立计时,互不影响;
- 无状态重置风险:避免原始代码中 expiration_time 被重复赋值导致逻辑失效。
⚠️ 注意事项:
- 当前实现将过期信息保存在内存中,程序重启后数据丢失。如需持久化,请改用文件(如 json/pickle)、SQLite 或 Redis;
- 生产环境应避免硬编码密钥,建议结合哈希校验、JWT 或非对称签名提升安全性;
- 若需支持并发访问,需增加线程锁(threading.Lock)或改用线程安全的数据结构。
通过这种设计,你不仅能精准控制单个密钥的生命周期,还能平滑扩展至成百上千个动态密钥的统一时效管理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











