코드 암호화

protect와 run, 유효 기간, 더 강력한 2단계 잠금, 그리고 머신 잠금이 전혀 필요 없는 포터블 산출물.

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 파일은 일반 파일이므로 이미 사용 중인 배포 방식 그대로 커밋하거나 복사하거나 배포할 수 있습니다 — 암호화는 파일과 함께 이동합니다.

동작 원리

.pya는 암호화된 봉투를 감싼 작은 버전 관리형 컨테이너입니다. magiclock run app.pya는 이를 메모리에서 복호화하고, 그 안에서 import되는 모든 것에 대해 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는 서로 배타적입니다 — 파일마다 하나만 선택하세요.

더 강력하게: 2단계 잠금(머신 + 패스프레이즈)

기본적으로 산출물은 올바른 머신에 있기만 하면 복호화됩니다. 여기에 패스프레이즈를 두 번째 인증 요소로 추가할 수 있습니다.

shell
magiclock protect app.py --lock-passphrase
# prompts for a passphrase (or reads $MAGICLOCK_PASSPHRASE non-interactively)

magiclock run app.pya --passphrase

포터블: 머신 잠금 전혀 없음

활성화하지 않은 머신에서 산출물을 실행해야 할 때가 있습니다 — 고객의 머신이거나, 직접 제어하지 않는 머신인 경우입니다. 포터블 모드는 머신 잠금을 없애고 대신 공유 비밀 값으로 잠금을 해제합니다 — 더 약하지만 배포하기 쉽습니다.

shell
# 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)는 서로 배타적입니다 — 산출물은 머신 잠금(선택적으로 패스프레이즈를 2단계 요소로 추가)이거나, 포터블(머신 식별 대신 패스프레이즈/키로 잠금 해제)이거나 둘 중 하나이며, 둘 다일 수는 없습니다.

CI와 스크립트 실행을 위해, 패스프레이즈와 포터블 키 모두 프롬프트 대신 환경 변수로 전달할 수 있습니다.

shell
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 레퍼런스에는 protectrun의 모든 플래그가 한곳에 정리되어 있습니다.