Chiffrer le code

protect et run, l'expiration, et les cinq niveaux de protection — des artefacts sans clé librement distribuables jusqu'au coffre à deux facteurs verrouillé sur la machine.

magiclock protect transforme un fichier .py en .pya — un conteneur chiffré et verrouillé — sans compilateur et sans jamais téléverser votre source où que ce soit. magiclock run l'exécute.

Utilisation de base

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/

Les fichiers .pya sont des fichiers ordinaires que vous pouvez committer, copier ou livrer par les canaux que vous utilisez déjà pour distribuer votre application — le chiffrement voyage avec le fichier. Par défaut, l'artefact est portable et sans clé : il se déchiffre de façon transparente sur toute machine où magiclock est installé, sans compte, sans phrase secrète et sans verrouillage machine côté exécution. Le niveau par défaut relève donc de la commodité/obfuscation — votre source n'est pas livrée en clair, mais quiconque possède le fichier et le runtime peut l'exécuter. Quand vous avez besoin d'un vrai contrôle d'accès, choisissez un niveau plus fort ci-dessous.

Choisir un niveau de protection

NiveauOptionsQui peut déchiffrer
Portable sans clé (par défaut)(aucune)Quiconque a magiclock installé — de l'ordre de la commodité/obfuscation.
Portable à phrase secrète--passphraseQuiconque connaît la phrase secrète, sur n'importe quelle machine.
Portable à clé--emit-keyQuiconque détient la clé générée, sur n'importe quelle machine.
Verrouillé machine--bind-machineUniquement cette machine activée — une clé machine non exportable plus la barrière de licence ; le niveau à facteur unique le plus fort.
Machine + phrase secrète--bind-machine --passphraseCette machine activée et la phrase secrète — deux facteurs.

Comment ça fonctionne

Un .pya est un petit conteneur versionné enveloppant une enveloppe chiffrée. magiclock run app.pya le déchiffre en mémoire, installe un hook d'import pour tout ce qu'il importe, puis l'exécute — rien n'est jamais réécrit sur disque en clair. Comme le bytecode marshalé qu'il contient est lié à la version de CPython qui l'a chiffré, un .pya produit sur Python 3.12 ne se chargera pas sur 3.13 ; relancez protect après avoir mis à niveau votre interpréteur.

Supprimer le fichier en clair

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

Expiration : artefacts à durée limitée et à autodestruction

Ces options inscrivent une expiration dans l'artefact chiffré lui-même — indépendamment de votre licence — après laquelle il refuse de se déchiffrer :

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 et --expires-at sont mutuellement exclusifs — choisissez-en un par fichier.

Portable avec un secret : phrase secrète ou clé

Le niveau par défaut, sans clé, ne demande rien à qui exécute l'artefact. Pour conserver la portabilité tout en ajoutant un secret d'accès, choisissez l'un des deux modes portables :

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 et --emit-key sont mutuellement exclusifs — choisissez un seul secret par artefact.

Le plus fort : verrouillage machine (--bind-machine)

Lorsque l'artefact ne doit absolument pas quitter vos machines, liez-le à cette machine activée — le déchiffrement exige alors la clé de coffre non exportable de cette machine et passe la barrière de licence, et le fichier est inutilisable partout ailleurs :

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

Ajoutez une phrase secrète par-dessus pour un verrou à deux facteurs — la bonne machine et un secret :

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 est réservé au portable et mutuellement exclusif avec --bind-machine — la clé d'un artefact verrouillé machine ne quitte jamais la machine, il n'y a donc rien à distribuer.

Pour la CI et les exécutions scriptées, la phrase secrète comme la clé portable peuvent venir de l'environnement plutôt que d'une invite :

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

La suite