加密程式碼
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 檔案就是普通檔案,你可以像現在發布應用程式一樣提交、複製或打包它——加密效果會隨檔案一起走。預設情況下,產物是免金鑰便攜的:在任何安裝了 magiclock 的機器上都能透明解密,執行端不需要帳號、密碼片語或機器鎖。因此預設檔位屬於便利/混淆等級——你的原始碼不會以明文出貨,但任何拿到檔案與執行環境的人都能執行它。需要真正的存取控制時,請從下方挑選更強的等級。
選擇保護等級
| 等級 | 旗標 | 誰能解密 |
|---|---|---|
| 免金鑰便攜*(預設)* | (無) | 任何安裝了 magiclock 的人——便利/混淆等級。 |
| 密碼片語便攜 | --passphrase | 任何知道密碼片語的人,在任何機器上。 |
| 金鑰便攜 | --emit-key | 任何持有所產生金鑰的人,在任何機器上。 |
| 機器鎖定 | --bind-machine | 只有這台已啟用的機器——不可匯出的機器金鑰加上授權閘門;最強的單因子等級。 |
| 機器+密碼片語 | --bind-machine --passphrase | 這台已啟用的機器加上密碼片語——二因子。 |
運作原理
.pya 是一個帶版本號的小型容器,裡面包著一個加密信封。magiclock run app.pya 會在記憶體中將它解密,為它匯入的所有內容安裝一個 import 掛鉤,然後執行——任何明文都不會被寫回磁碟。因為裡面的封裝位元碼與加密它的 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 彼此互斥——每個檔案只能擇一使用。
便攜再加一道祕密:密碼片語或金鑰
免金鑰的預設對執行產物的人不作任何要求。想保留便攜性、又想加上一道存取祕密,可以在兩種便攜模式中擇一:
# Passphrase-protected, still runs on any machine:
magiclock protect app.py --passphrase
magiclock run app.pya --passphrase
# Or hand out a generated key instead of a passphrase:
magiclock protect app.py --emit-key
magiclock run app.pya --key <the-printed-key>--passphrase 與 --emit-key 彼此互斥——每個產物只能擇一種祕密。
最強:機器鎖(--bind-machine)
當產物完全不允許離開你的機器時,把它綁定到這台已啟用的機器——解密將要求這台機器不可匯出的保管庫金鑰,並通過授權閘門,檔案在其他任何地方都毫無用處:
magiclock protect app.py --bind-machine
magiclock run app.pya # only works on the machine that encrypted it再疊加一組密碼片語即為二因子鎖——要有對的機器,還要有祕密:
magiclock protect app.py --bind-machine --passphrase
# prompts for a passphrase (or reads $MAGICLOCK_PASSPHRASE non-interactively)
magiclock run app.pya --passphrase--emit-key 僅限便攜使用,與 --bind-machine 互斥——機器鎖定產物的金鑰永遠不會離開那台機器,因此沒有東西可以交給別人。
在 CI 或腳本化執行中,密碼片語與便攜金鑰都可以從環境變數讀取,而不必透過提示輸入:
export MAGICLOCK_PASSPHRASE=... # for --passphrase artifacts (portable or two-factor)
export MAGICLOCK_DECRYPT_KEY=... # alternative to `run --key` for --emit-key artifacts
magiclock run app.pya