コードの暗号化
protect と run、有効期限、より強力な二要素ロック、そしてマシンロックをまったく必要としないポータブル形式の成果物について。
magiclock protect は、コンパイラを使わず、ソースコードをどこにもアップロードすることなく、.py ファイルを .pya — 暗号化されゲートで保護されたコンテナ — に変換します。magiclock run はそれを実行します。
基本的な使い方
# First run: signs you in and activates this machine, then encrypts.
# Every encrypt after that is instant and non-interactive.
magiclock protect app.py # -> app.pya
magiclock run app.pya
# Point at a directory to protect a whole project tree recursively
# (.venv/venv/__pycache__/.git/dist/build are skipped automatically).
magiclock protect src/.pya ファイルは普通のファイルであり、すでに使っている方法でコミット・コピー・出荷できます — 暗号化はファイルと一緒に移動します。
仕組み
.pya は、暗号化されたエンベロープを包む、小さなバージョン管理付きコンテナです。magiclock run app.pya はそれをメモリ上で復号し、インポートするものすべてに対してインポートフックをインストールしてから実行します — 平文としてディスクに書き戻されることは一切ありません。内部の marshal 化されたバイトコードは、暗号化を行った CPython のバージョンに紐づいているため、Python 3.12 でビルドした .pya は 3.13 では読み込めません。インタプリタをアップグレードした場合は protect を再実行してください。
平文の削除
magiclock protect app.py --remove # encrypt, then delete app.py有効期限:時限式・自己消去型の成果物
以下のフラグは、ライセンスとは独立して、暗号化された成果物そのものに有効期限を刻印します。期限を過ぎると復号を拒否するようになります。
magiclock protect app.py --expires-in 30d # stops decrypting in 30 days
magiclock protect app.py --expires-at 2026-12-31 # stops decrypting on a date
magiclock protect app.py --trial # fixed 48-hour self-destruct — for demos and evaluations--trial、--expires-in、--expires-at は互いに排他的です — ファイルごとにいずれか 1 つを選んでください。
より強力に:二要素ロック(マシン+パスフレーズ)
デフォルトでは、成果物は正しいマシン上にあることだけで復号できます。第二要素としてパスフレーズを追加できます。
magiclock protect app.py --lock-passphrase
# prompts for a passphrase (or reads $MAGICLOCK_PASSPHRASE non-interactively)
magiclock run app.pya --passphraseポータブル形式:マシンロックなし
有効化していないマシン — 顧客の環境や、自分の管理下にないマシン — で成果物を実行する必要がある場合もあります。ポータブルモードはマシンロックを外し、代わりに共有シークレットで解錠します — 強度は下がりますが、配布は可能になります。
# Passphrase-protected, no machine lock:
magiclock protect app.py --no-bind-machine --passphrase
magiclock run app.pya --passphrase
# Or hand out a generated key instead of a passphrase:
magiclock protect app.py --no-bind-machine --emit-key
magiclock run app.pya --key <the-printed-key>--lock-passphrase とポータブル系フラグ(--no-bind-machine、--passphrase、--emit-key)は互いに排他的です — 成果物は「マシンロック(任意でパスフレーズを第二要素として追加)」か「ポータブル(マシン識別ではなくパスフレーズ/キーで解錠)」のいずれか一方であり、両方を同時には選べません。
CI やスクリプトからの実行では、プロンプトの代わりに環境変数からパスフレーズやポータブルキーを渡すこともできます。
export MAGICLOCK_PASSPHRASE=... # for --lock-passphrase or portable --passphrase artifacts
export MAGICLOCK_DECRYPT_KEY=... # alternative to `run --key` for --emit-key artifacts
magiclock run app.pya次に読むべきもの
- モデル・リソースの暗号化では、コード以外の資産にも同じ有効期限・ポータブルオプションを適用できます。
- アカウントと有効化では、オフライン時の挙動やデバイスが失効した場合について説明しています。
- CLI リファレンスには、
protectとrunのすべてのフラグがまとめられています。