Python如何实现文件定时加密、到期自动解密及对应Linux实现方案
任务文件定时加解密实现方案
Python 原生实现路径
- 核心前提:不要依赖文件系统自带的时间戳判定任务状态,需单独存储结构化的项目元数据,避免用户手动修改文件时间戳导致逻辑失效
- 元数据建议存储为项目目录下的
.task_meta.json,字段包含项目创建时间、完成时限、是否标记完成、上次锁定时间、冷却期长度、加密密钥信息 - 示例元数据结构:
{ "Prime.py": { "create_time": "2024-05-01T12:00:00", "deadline_days": 4, "is_completed": false, "lock_time": null } }
- 元数据建议存储为项目目录下的
- 加密实现:使用Python生态成熟的对称加密模块实现,个人使用场景可靠性足够
- 提前生成固定的加密密钥,存储在用户目录的隐藏文件中,权限设置为仅当前用户可读写,不要和项目文件放在同一公开目录
- 加密流程:读取原项目文件二进制内容 -> 用密钥加密 -> 将加密内容写入
原文件名.enc后缀的临时文件 -> 删除原项目文件 - 解密流程:读取
.enc后缀的加密文件 -> 用同密钥解密 -> 将解密内容写回原项目文件路径 -> 删除.enc临时文件 - 核心代码示例(依赖
cryptography库,可通过pip install cryptography安装):import os import json from datetime import datetime, timedelta from cryptography.fernet import Fernet PROJECT_DIR = "/home/xyz/Desktop/Projects" META_PATH = os.path.join(PROJECT_DIR, ".task_meta.json") COOLDOWN_DAYS = 20 KEY_PATH = os.path.expanduser("~/.task_manager_key") # 加载或生成加密密钥 def load_fernet(): if not os.path.exists(KEY_PATH): key = Fernet.generate_key() with open(KEY_PATH, "wb") as f: f.write(key) os.chmod(KEY_PATH, 0o600) with open(KEY_PATH, "rb") as f: key = f.read() return Fernet(key) # 加密文件 def encrypt_file(file_path, fernet): with open(file_path, "rb") as f: data = f.read() enc_data = fernet.encrypt(data) enc_path = f"{file_path}.enc" with open(enc_path, "wb") as f: f.write(enc_data) os.remove(file_path) # 解密文件 def decrypt_file(file_path, fernet): enc_path = f"{file_path}.enc" with open(enc_path, "rb") as f: enc_data = f.read() data = fernet.decrypt(enc_data) with open(file_path, "wb") as f: f.write(data) os.remove(enc_path) # 全量状态检查 def check_tasks(): if not os.path.exists(META_PATH): return with open(META_PATH, "r") as f: task_meta = json.load(f) fernet = load_fernet() now = datetime.now() meta_updated = False for filename, info in task_meta.items(): if info["is_completed"]: continue target_path = os.path.join(PROJECT_DIR, filename) # 检查逾期待锁定的任务 if info["lock_time"] is None: create_time = datetime.fromisoformat(info["create_time"]) deadline = create_time + timedelta(days=info["deadline_days"]) if now > deadline and os.path.exists(target_path): encrypt_file(target_path, fernet) info["lock_time"] = now.isoformat() meta_updated = True # 检查冷却期到、待解锁的任务 else: lock_time = datetime.fromisoformat(info["lock_time"]) cooldown_end = lock_time + timedelta(days=COOLDOWN_DAYS) enc_path = f"{target_path}.enc" if now > cooldown_end and os.path.exists(enc_path): decrypt_file(target_path, fernet) info["lock_time"] = None info["create_time"] = now.isoformat() meta_updated = True # 回写更新后的元数据 if meta_updated: with open(META_PATH, "w") as f: json.dump(task_meta, f, indent=2)
- 状态检查逻辑:脚本定期遍历所有元数据记录,执行两个判定逻辑
- 对未标记完成、未锁定的项目:计算当前时间与创建时间的差值,若超过预设完成时限,立即触发加密流程,同时记录当前时间为锁定时间写入元数据
- 对已锁定的项目:计算当前时间与锁定时间的差值,若超过20天的冷却期,立即触发解密流程,清空元数据里的锁定时间,重置项目的完成时限计算节点
- 定时触发:不要让Python脚本长期驻留后台,结合Linux系统自带的cron定时任务执行状态检查,避免内存占用、电脑重启后失效的问题
- cron配置示例(每12小时执行一次状态检查):
0 */12 * * * /usr/bin/python3 /home/xyz/task_manager.py - 支持命令行参数扩展:比如运行
python task_manager.py --complete Prime.py即可将对应项目标记为已完成,跳过后续加解密流程
- cron配置示例(每12小时执行一次状态检查):
- 适配现有代码的改造点:原脚本的
takeData函数在生成项目文件时,同步将项目的创建时间、计算出的完成时限写入.task_meta.json,替换原本只在文件头写提示文字的逻辑
Linux 原生辅助实现方案
如果不想依赖Python加密库,可以直接用文件权限变更代替加密,降低实现复杂度:
- 核心逻辑和Python方案完全一致,仅把加密/解密步骤替换为文件权限修改
- 任务逾期触发锁定时,执行
chmod 000 目标文件路径,将文件权限设置为所有用户无读写执行权限,实现不可访问效果 - 冷却期到期触发解锁时,执行
chmod 644 目标文件路径,恢复当前用户的读写权限
- 任务逾期触发锁定时,执行
- 注意点:这种方案的锁定强度低于加密,root用户可以直接绕过权限限制访问文件,仅适合个人使用、无高安全要求的场景
- 同样搭配cron定时执行权限检查,不需要长期运行后台进程
内容的提问来源于stack exchange,提问作者Fatty Photon
相关产品推荐
相关产品推荐

