You need to enable JavaScript to run this app. Python如何实现文件定时加密、到期自动解密及对应Linux实现方案
优惠活动
大模型
产品
解决方案
定价
更多

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即可将对应项目标记为已完成,跳过后续加解密流程
  • 适配现有代码的改造点:原脚本的takeData函数在生成项目文件时,同步将项目的创建时间、计算出的完成时限写入.task_meta.json,替换原本只在文件头写提示文字的逻辑

Linux 原生辅助实现方案

如果不想依赖Python加密库,可以直接用文件权限变更代替加密,降低实现复杂度:

  • 核心逻辑和Python方案完全一致,仅把加密/解密步骤替换为文件权限修改
    • 任务逾期触发锁定时,执行chmod 000 目标文件路径,将文件权限设置为所有用户无读写执行权限,实现不可访问效果
    • 冷却期到期触发解锁时,执行chmod 644 目标文件路径,恢复当前用户的读写权限
  • 注意点:这种方案的锁定强度低于加密,root用户可以直接绕过权限限制访问文件,仅适合个人使用、无高安全要求的场景
  • 同样搭配cron定时执行权限检查,不需要长期运行后台进程

内容的提问来源于stack exchange,提问作者Fatty Photon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 11:36:05