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 :

  1. Exécute les checks anti-debug et VM.
  2. Lit et vérifie le HMAC du .ironenc.
  3. Collecte le fingerprint hardware.
  4. Lit et vérifie la signature ECDSA de la licence.
  5. Compare le fingerprint de la licence avec la machine courante.
  6. Dérive la clé AES-256 via Argon2id.
  7. 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.ironenc dans 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.exe avec 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.

🔐
PRODUIT LIÉ
IronLock v2.0
← Article précédent Article suivant →