Le pipeline de distribution
Distribuer un programme Python sécurisé implique 5 étapes distinctes : compilation en EXE, chiffrement du binaire, génération d'un loader, signature de la licence et packaging pour le client. IronLock automatise les étapes 2 à 5 ; PyInstaller gère l'étape 1.
# Vue d'ensemble du pipeline
app.py
└── PyInstaller → app.exe (PE64)
└── ironlock encrypt → app.ironenc + loader.exe
└── ironlock license → licence_client.lic
└── Package client : loader.exe + app.ironenc + licence_client.lic
Étape 1 : PyInstaller
PyInstaller bundle Python, ses dépendances et le script dans un EXE autonome. Points critiques pour la compatibilité avec IronLock :
# Build PyInstaller en mode onefile
pyinstaller app.py --onefile --noconsole --strip --name app_v1.0
# IronLock détecte le format via les magic bytes
# PE32 : 4D 5A (MZ) → exécutable Windows 32-bit
# PE64 : 4D 5A + PE header → exécutable Windows 64-bit
# La détection est automatique
Important : ne pas utiliser --key de PyInstaller (obfuscation PyInstaller native) car cela interfère avec le chiffrement IronLock. IronLock gère l'obfuscation lui-même.
Étape 2 : chiffrement IronLock
# Chiffrer le PE64
ironlock encrypt dist/app_v1.0.exe --pubkey keys/public.pem --output dist/protected/ --antidebug-level high --vm-detect block --hmac-verify
# Résultat dans dist/protected/
# ├── app_v1.0.ironenc (PE64 chiffré AES-256-GCM)
# ├── loader.exe (loader IronLock)
# └── manifest.json (hashes, version, metadata)
HMAC intégrité
Avec --hmac-verify, le loader vérifie un HMAC-SHA256 sur l'intégralité du fichier .ironenc avant toute tentative de déchiffrement. Si un byte a été modifié (patch de débogueur, corruption réseau), le loader se ferme silencieusement.
Étape 3 : le loader embarqué
Le loader loader.exe est un exécutable Python minimal qui :
- Exécute les checks anti-debug et VM.
- Lit et vérifie le HMAC du
.ironenc. - Collecte le fingerprint hardware.
- Lit et vérifie la signature ECDSA de la licence.
- Compare le fingerprint de la licence avec la machine courante.
- Dérive la clé AES-256 via Argon2id.
- Déchiffre le PE en mémoire et l'exécute.
Le PE déchiffré n'est jamais écrit sur disque — il s'exécute directement depuis un buffer mémoire.
Étape 4 : génération de licence
# Le client envoie son fingerprint.json
ironlock fingerprint --output fingerprint_client.json
# Côté éditeur : générer la licence
ironlock license --privkey keys/private.pem --fingerprint fingerprint_client.json --product "app_v1.0" --expires 2027-08-01 --activations 1 --output licence_client.lic
# licence_client.lic (JSON + signature ECDSA P-384)
{
"product": "app_v1.0",
"hardware_id": "a3f8c2...",
"expires": "2027-08-01",
"activations": 1,
"issued": "2026-08-15T10:00:00Z",
"signature": "base64_ecdsa_p384..."
}
Étape 5 : packaging client
# Package final à livrer au client
client_package/
├── loader.exe # exécutable principal (renommé app_v1.0.exe)
├── app_v1.0.ironenc # payload chiffré
├── licence_client.lic # licence signée
└── manifest.json # métadonnées de version
# IronLock peut générer ce package automatiquement
ironlock package --protected dist/protected/ --licence licence_client.lic --output client_package_v1.0.zip
Mise à jour de licence
Quand la licence expire ou que le client change de machine, le workflow de renouvellement :
# Client génère un nouveau fingerprint
loader.exe --fingerprint-only > nouveau_fingerprint.json
# Éditeur génère une nouvelle licence
ironlock license --migrate --old-licence licence_ancien.lic --fingerprint nouveau_fingerprint.json --extends 365d --output licence_renouvele.lic
Pièges courants
- Ne pas chiffrer le loader lui-même — le loader doit s'exécuter non chiffré. Chiffrer uniquement le payload
.ironenc. - Chemin relatif hardcodé — le loader cherche
app.ironencdans le même dossier. Ne pas réorganiser l'arborescence sans reconfigurer le manifest. - Antivirus et faux positifs — les loaders Python packagés avec PyInstaller déclenchent parfois des faux positifs. Signer le
loader.exeavec un certificat Authenticode résout 95% des cas. - Droits administrateur — IronLock ne requiert pas de droits admin. Si votre application en nécessite, le manifest UAC doit être intégré au loader, pas au payload.
Conclusion
Le pipeline PyInstaller → IronLock est la méthode la plus robuste pour distribuer une application Python Windows sécurisée en 2026. Les 5 étapes sont reproductibles et automatisables dans un CI/CD. Les seules opérations manuelles sont la génération des clés (une fois) et la signature des licences client.