加密你的代码

protect 与 run、有效期、更强的二因子锁,以及完全不需要机器锁的便携档。

magiclock protect 把一个 .py 文件变成 .pya——一个加了闸门的加密容器——不需要编译器,也不会把你的源码上传到任何地方。magiclock run 负责运行它。

基本用法

shell
# 首次运行:登录并激活这台机器,然后加密。
# 之后每次加密都是瞬时完成、无需交互。
magiclock protect app.py            # -> app.pya
magiclock run app.pya

# 指向一个目录即可递归保护整个项目树
# (.venv/venv/__pycache__/.git/dist/build 会被自动跳过)。
magiclock protect src/

.pya 就是普通文件,你可以像现在分发应用一样提交、拷贝或打包它——加密效果随文件一起走。

工作原理

.pya 是一个带版本号的小容器,里面包着一个加密信封。magiclock run app.pya 会把它在内存中解密,为它 import 的所有内容安装一个 import 钩子,然后执行——任何明文都不会被写回磁盘。因为里面的字节码和加密它的 CPython 版本绑定,Python 3.12 加密出的 .pya 不能在 3.13 上加载;升级解释器后重新 protect 一次即可。

删除明文

shell
magiclock protect app.py --remove   # 加密后删除 app.py

有效期:限时与自毁产物

以下参数把有效期直接戳进加密产物本身——独立于你的授权——过期后该产物拒绝解密:

shell
magiclock protect app.py --expires-in 30d        # 30 天后停止解密
magiclock protect app.py --expires-at 2026-12-31  # 到指定日期后停止解密
magiclock protect app.py --trial                  # 固定 48 小时自毁——用于演示与评估

--trial--expires-in--expires-at 三者互斥,每个文件只能选一个。

更强:二因子锁(机器 + 口令)

默认情况下产物只需要在对的机器上就能解密。加一个口令作为第二因子:

shell
magiclock protect app.py --lock-passphrase
# 交互式提示输入口令(或非交互读取 $MAGICLOCK_PASSPHRASE)

magiclock run app.pya --passphrase

便携档:完全不绑定机器

有时你需要产物能在一台你没有激活过的机器上运行——客户的机器,或者你管不到的机器。便携档去掉机器锁,改用共享密钥解锁——更弱,但可以分发:

shell
# 口令保护,不绑定机器:
magiclock protect app.py --no-bind-machine --passphrase
magiclock run app.pya --passphrase

# 或者分发一个生成好的密钥而不是口令:
magiclock protect app.py --no-bind-machine --emit-key
magiclock run app.pya --key <打印出来的密钥>

--lock-passphrase 与便携相关参数(--no-bind-machine--passphrase--emit-key)互斥——一个产物要么是机器锁定的(可选加口令作为第二因子),要么是便携的(靠口令/密钥解锁而不是机器身份),二者不能同时选。

在 CI 或脚本化运行中,口令和便携密钥都可以从环境变量读取,而不必交互输入:

shell
export MAGICLOCK_PASSPHRASE=...     # 用于 --lock-passphrase 或便携 --passphrase 产物
export MAGICLOCK_DECRYPT_KEY=...    # --emit-key 产物中 `run --key` 的替代方式
magiclock run app.pya

接下来看什么

  • 加密模型与资源把同样的有效期与便携选项用在非代码资产上。
  • 账号与激活介绍离线时会发生什么,以及设备被吊销时会发生什么。
  • CLI 速查一次性列出 protectrun 的全部参数。