编译强档
把应用编译成原生二进制——不出货明文 Python。默认便携;加上 --bind-machine 后,授权闸门自动插入每一个模块,没有单独一处检查可以被找到删掉。
便捷档出货的是解密一次即可读的 Python 字节码。magiclock build 更进一步:把整个源码树编译成原生机器码,并加密你打包进去的模型——完全不出货明文 Python。默认产物是便携的:可在任何机器上运行,不需要账号、也不需要激活。改用 --bind-machine 构建,它还会自动给每一个模块插入一次授权闸门检查,把这个闸门直接编织进编译后的原生代码,并内嵌厂商公钥——没有单独一处检查可以被攻击者找到并 patch 掉。
不需要标记任何东西
没有装饰器,也不需要给代码加任何注解——你的源码完全不用改。在 --bind-machine(或 --web-gate)构建下,magiclock build 会遍历从入口文件能到达的每一个 .py 模块,在编译前给每个模块插入一次闸门检查(核对 python_protect 这项能力)。入口模块还会自动插入一次 magiclock.bootstrap() 调用,不需要你自己写:
# 你的源码,原封不动——不需要装饰器,也不需要手动加 bootstrap() 调用
def export_report(data: str) -> bytes:
return render_pdf(data)magiclock build app.py --bind-machine # 树里的每一个模块——包括这个——都会被自动加上闸门闸门检查每个模块只跑一次,在进程第一次 import 它的时候执行——这是"每模块一个检查点",不是"每次调用一个检查点"(长时间运行的进程下这意味着什么、以及有效期/吊销的权衡,见安全模型)。
编译
magiclock build app.py # -> dist/app.<...>.so (默认便携——可在任何机器上运行)
magiclock build app.py --bind-machine # 机器锁定构建,带逐模块授权闸门
magiclock build app.py --standalone # 改为生成一个自包含的应用目录
magiclock build app.py --no-compile # 只扫描 + 注入 + 内嵌——跳过编译(不需要 C 工具链)
magiclock build app.py --model weights.onnx # 同时把一个模型加密打进构建产物(可重复)| 参数 | 默认值 | 含义 |
|---|---|---|
-o, --output-dir | dist | 构建产物的输出目录。 |
--source-root | 入口文件所在目录 | 要扫描/转换的项目根目录(当 app.py 不在项目顶层时使用)。 |
--module | — | 编译成单文件原生扩展(默认目标)。 |
--standalone | — | 改为编译成自包含的应用目录,与 --module 互斥。 |
--no-compile | 关闭 | 只做扫描、注入闸门、内嵌资源,跳过真正的原生编译——适合检查转换结果,或构建机没有 C 工具链时使用。 |
--keep-tmp | 关闭 | 保留中间转换目录,不清理。 |
--model PATH | 无 | 加密一个模型并打进构建产物,可重复使用。 |
--model-lock-passphrase | 关闭 | 给打包进去的模型加一个口令作为第二因子(至少需要一个 --model,且需要 --bind-machine)。 |
--model-trial / --model-expires-in / --model-expires-at | 无 | 打包模型的有效期——语义与加密你的代码的有效期参数相同,彼此互斥。 |
--bind-machine | 关闭 | 机器锁定构建:编译进授权闸门,二进制只能在这台机器已激活的保险库下运行;打包的模型加密到本机密钥。不加它就是便携构建(默认——见下文)。 |
--passphrase / --emit-key | 关闭 | 便携构建下给打包的模型加一道密钥,替代免密钥默认:--passphrase 从口令派生模型密钥;--emit-key 生成并打印一个随机密钥。 |
你的用户拿到什么
编译出的 .so/.pyd/独立目录在运行它的机器上不需要安装 MagicLock、不需要账号、不需要联网——解密与授权检查都完全离线(见安全模型)。
默认情况下,构建产物是便携的:二进制可在任何机器上运行,无需账号、无需保险库,不编译进授权闸门,打包的模型默认免密钥——它们会通过编译进产物的运行时在任何机器上自行解密。此时保护依托原生编译本身(再加上你可选的模型密钥:--emit-key 打印一个可分发的密钥,--passphrase 从口令派生一个,二进制通过 magiclock.open_model(path, key=...) 或 passphrase=... 读取)。加上 --web-gate 还能在发货后保有一个远程停用开关(见云端控制)——便携构建既可自由分发,又能被远程叫停。
改用 --bind-machine 构建则把二进制锁定到构建它的那台机器:构建时会把一份指明本机席位的签名声明烤进产物,运行时闸门拒绝在任何其他机器的保险库下运行——即使那台机器也已激活。打包的模型还会额外加密到本机密钥。如果你需要同一个机器锁定程序在第二台工作机或部署服务器上运行,把那台机器也纳入你的账号并在那台机器上构建。