加密程式碼

protect 與 run、有效期,以及五種保護等級——從可自由散布的免金鑰便攜檔,到機器鎖定的二因子鎖。

magiclock protect 能把一個 .py 檔案轉換成 .pya——一個加了閘門的加密容器——不需要編譯器,也不會把你的原始碼上傳到任何地方。magiclock run 負責執行它。

基本用法

shell
# 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 即可。

刪除明文

shell
magiclock protect app.py --remove   # encrypt, then delete app.py

有效期:限時與自毀產物

以下旗標會把有效期直接戳進加密產物本身——獨立於你的授權——過期後該產物會拒絕解密:

shell
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 彼此互斥——每個檔案只能擇一使用。

便攜再加一道祕密:密碼片語或金鑰

免金鑰的預設對執行產物的人不作任何要求。想保留便攜性、又想加上一道存取祕密,可以在兩種便攜模式中擇一:

shell
# 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

當產物完全不允許離開你的機器時,把它綁定到這台已啟用的機器——解密將要求這台機器不可匯出的保管庫金鑰,並通過授權閘門,檔案在其他任何地方都毫無用處:

shell
magiclock protect app.py --bind-machine
magiclock run app.pya            # only works on the machine that encrypted it

再疊加一組密碼片語即為二因子鎖——要有對的機器,要有祕密:

shell
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 或腳本化執行中,密碼片語與便攜金鑰都可以從環境變數讀取,而不必透過提示輸入:

shell
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

接下來看什麼

  • 加密模型與資源 把同樣的有效期與保護等級選項套用在非程式碼資產上。
  • 帳號與啟用 說明離線時會發生什麼,以及裝置遭撤銷時會發生什麼。
  • CLI 參考 一次列出 protectrun 的所有旗標。