PHP 8.x · loader Rust · Web + CLI · Linux / Unix

Vendez vos programmes PHP.
Sans livrer le code source avec.

BinaryPHP chiffre votre code PHP commercial avec AES-256-GCM, avec une clé indépendante par fichier, et l'attache à un domaine ou un MAC avec date d'expiration — tout le déchiffrement est géré de manière transparente par un loader Rust ultraléger. Les clés sont mises à jour chaque trimestre, avec une rétrocompatibilité permanente, et les coûts de cracking dépassent largement les frais de licence.

1. Encoder en ligne 2. Le client installe 3. Exécuter chiffré
# Sur binaryphp.com/encode/, téléversez le fichier et remplissez la licence :

  Domaine :    acmestore.com, *.acmestore.com
  Expiration : 2027-12-31
  Nom :        acme-pro

# Entrée  →  plugin.php          (le code que vous avez écrit, ~40 Ko)
# Sortie  →  plugin.php          (chiffré, ~41 Ko de contenu binaire)

# Le nom et l'extension restent identiques — vous pouvez écraser le fichier original
# directement, sans rien changer aux appels. Le loader détecte les fichiers par
# le magic header "BPHP2" (5 octets), indépendamment de l'extension.
# La clé maître reste sur notre serveur ; vous ne recevez que le résultat chiffré.

PHP n'est pas compilé.
Pour ceux qui vendent du code, c'est un gros problème.

Votre client est votre concurrent

À l'instant où le client télécharge votre .zip, chaque ligne de PHP que vous avez écrite peut être copiée, modifiée, revendue.

Une clé de licence ne suffit pas

Si le code source est étalé là, en quelques minutes la vérification de licence est retirée. Sans protection au niveau du code, une licence n'est qu'un interrupteur, pas un mur.

Votre travail est éparpillé sur les disques des autres

Dès que le client télécharge, votre propriété intellectuelle est éparpillée sur des hébergements partagés, VPS, machines CI — vous ne voyez rien, vous ne contrôlez rien, et un tar -xzf suffit pour tout extraire.

Fonctionnement

1

Téléverser

Glissez un fichier .php ou un .zip de plugin entier dans notre encodeur en ligne, configurez le domaine, le MAC, la date d'expiration. C'est tout. La clé maître reste de notre côté — vous n'avez aucune préoccupation de conservation.

2

Distribuer

Téléchargez le fichier chiffré. Chaque fichier reçoit un salt indépendant de 16 octets et une clé dérivée par HKDF-SHA256. Si même un octet est modifié, la vérification GCM échoue et l'exécution est refusée.

3

Charger

Le client ajoute la ligne extension=binaryphp.so dans php.ini. Le loader s'insère dans le pipeline de compilation PHP, déchiffre en mémoire, vérifie la licence (domaine via SERVER_NAME / HTTP_HOST ou MAC en CLI), et passe le code en clair directement au moteur Zend.

Fonctionnalités intégrées

🔐 AES-256-GCM

Chiffrement authentifié au standard NIST. Si un octet est modifié, le tag GCM ne passe pas et l'exécution est refusée.

🧂 Clé indépendante par fichier

Chaque fichier chiffré a un salt indépendant de 16 octets, puis HKDF-SHA256 dérive une clé spécifique au fichier. Chaque fichier est scellé séparément, sans interaction.

🛡️ Fonctions critiques dans notre VM

Les fonctions marquées #[binaryphp\Protected] sont compilées en notre propre bytecode — ni PHP ni opcode Zend. À l'exécution, le loader les interprète directement ; les algorithmes n'apparaissent jamais sous forme de source sur le disque du client.

🌐 Licence multi-domaines

Une licence peut lister plusieurs hostnames ou wildcards (*.example.com). Si un correspond, c'est validé.

🔌 Liaison à l'adresse MAC

Pour les outils CLI, cron jobs et environnements sans HTTP : liez la licence directement à l'adresse MAC de la machine du client (lue depuis /sys/class/net).

⏳ Date d'expiration

Émettez des versions à durée limitée (essai, abonnement, cycle de release). Le loader compare l'horloge système au timestamp embarqué dans le fichier.

⚙️ Extension PHP standard

Chargée via extension= dans php.ini. PHP-FPM, mod_php, CLI, FrankenPHP — tous supportés.

🪶 Loader léger

Une seule .so de ~2,0 Mo après strip (incluant la VM bytecode et le JIT cranelift). Déchiffrement par fichier en moins d'1 ms.

🔁 Aucun impact sur les fichiers non chiffrés

Les fichiers .php ordinaires sont compilés normalement — le loader n'intercepte que les fichiers avec le magic header BinaryPHP, le reste n'est pas touché.

Performance : le chiffrement ne coûte presque rien

Le loader s'accroche à zend_compile_file, chaque processus PHP ne déchiffre chaque fichier qu'une fois. Après compilation en opcode Zend, la vitesse d'exécution est identique à PHP natif. Avec OPcache, même ce déchiffrement unique est amorti par le cache.

Benchmark hot loop 1 million d'itérations (for + % + accumulateur) · plus court = plus rapide · référence : PHP natif
PHP natif
88,6 ms
1,0×
binaryphp-rs
89,5 ms
1,0×
binaryphp-vm + JIT
~115 ms
1,3×
binaryphp-vm interprété
197,6 ms
2,2×
natif / .bphp chiffrement complet #[Protected] · cranelift JIT #[Protected] · interprété pur
workload PHP natif binaryphp-rs
(.bphp · chiffrement complet)
binaryphp-vm
(#[Protected] · VM bytecode)
1 million d'itérations hot loop dans une fonction (for + % + accumulateur) 88,61 ms ± 0,95 89,48 ms ± 3,08 ~115 ms (JIT) · interprété 197,56 ms
démarrage à froid — petit fichier (~220 o) 56,05 ms ± 1,62 56,46 ms ± 1,34 ~bphp (juste un stub, fonction non appelée, VM non démarrée)
démarrage à froid — fichier 10 Ko (200 fonctions) 57,14 ms ± 1,33 57,09 ms ± 1,57 ~bphp (coût VM à l'appel, pas au chargement)
OPcache régime établi identique à natif identique à natif coût supplémentaire à chaque appel
Natif ≈ binaryphp-rs (différence dans la marge d'erreur). binaryphp-vm hot loop environ 1,3× plus lent (cranelift JIT optimise le hot path entier) — en échange, protection au niveau bytecode : même si la clé maître fuit, le contenu des fonctions reste invisible.

Mesuré le 2026-05-05 avec hyperfine, chaque jeu de données 30 exécutions. Environnement : Debian 12 (kernel 6.5) + PHP 8.2.30 + Rust 1.95.0, Intel Xeon E5-2680 v4 @ 2.40 GHz (binaryphp.so 548 Ko, build release + LTO). Le coût de déchiffrement par include équivaut à taille du fichier / 1 Go/s (accélération matérielle AES-NI), plus ~50 µs pour HKDF et la vérification de licence. Le coût d'exécution VM est proportionnel au nombre d'instructions bytecode. Les optimisations peephole du compilateur ($x++, $x += k, $x = $x + e, comparaisons entières slot-vs-slot, $x * imm, x % imm) ont compressé le coût hot loop de ~5× à ~2,5× en fusionnant les opérations stack LoadVar / StoreVar en une seule op.

Couverture du langage VM : POO (classes, extends, abstract, interface, trait + use, static, constantes de classe, $this, parent::, self::, méthodes magiques __construct / __get / __set / __call) ; closures function () use (…) et fonctions fléchées fn () => expr ; try / catch / finally / throw ; match, === / !==, ??, ?:, <=>, instanceof ; générateurs lazy / coroutines (yield avec frame snapshot & resume — générateurs infinis utilisables, seules les valeurs réellement consommées sont calculées) ; for / while / foreach / switch / break / continue complets ; spread ...$args ; références &$x (paramètres de fonction et built-ins comme array_push / sort) ; global ; heredoc / nowdoc ; ~50 fonctions built-in (strlen, count, trim, explode, implode, sprintf, md5, sha1, base64_encode/decode, array_*, etc.) ; #[Protected] applicable aux méthodes de classe, $this->prop lecture/écriture synchronisée automatiquement entre PHP et VM ; cranelift AOT JIT optimise les hot loops entiers.

Comment choisir : pour livrer un package complet, .bphp (binaryphp-rs) suffit — la différence avec PHP natif n'est plus mesurable. #[Protected] (binaryphp-vm) est réservé aux fonctions les plus sensibles — validation de licence, dérivation de clé, anti-tamper — moyennant ~2,5× le coût d'exécution, vous obtenez « même si la clé maître fuit, la logique principale reste invisible ». Avec OPcache, les chemins non protégés sont aussi rapides que PHP natif.

Plans et tarifs

Via Stripe, mensuel ou annuel, annuel automatiquement -20%.

Free

$0gratuit pour toujours
  • Connexion Google, utilisable immédiatement
  • Par fichier 1 Mo.php ou .zip
  • 1 domaine exact (pas de wildcards) + 1 MAC
  • Force de chiffrement identique aux versions payantes
  • Limite de débit en envoi
Se connecter pour commencer
Pour ISV

Ultra

$10/ mois · $96 / an (économisez 20%)
  • Inclut tout Pro
  • Par fichier 300 Mo (upload multipart pour gros fichiers)
  • API REST + Webhook, intégrable à votre flux de vente
  • Le client commande → vous appelez notre API → on envoie le lien de téléchargement par webhook → vous transmettez au client
  • Domaine / MAC / expiration spécifiables individuellement à chaque encodage
  • Support prioritaire
S'abonner via Stripe

La version gratuite et les versions payantes utilisent le même moteur d'encodage ! Même AES-256-GCM, même VM bytecode, force de protection rigoureusement identique. Seule différence : les quotas d'utilisation (taille de fichier, droits API, débit batch).

Installer le loader

Gratuit, librement redistribuable. Tout hôte qui exécutera un plugin chiffré BinaryPHP doit d'abord installer ceci.

Côté client

Installation standard (Debian/Ubuntu, PHP 8.2)

# 1. Copier le .so dans le répertoire d'extensions PHP
$ sudo cp binaryphp.so /usr/lib/php/20220829/

# 2. Activer l'extension
$ echo 'extension=binaryphp.so' | sudo tee /etc/php/8.2/mods-available/binaryphp.ini
$ sudo phpenmod binaryphp

# 3. Redémarrer PHP-FPM (ou votre SAPI)
$ sudo systemctl restart php8.2-fpm

Vérifier que le loader est activé :

$ php -r 'echo binaryphp_version();'
0.9.2

$ php -r 'echo binaryphp_hostname();'
your-domain-or-hostname

$ php -r 'print_r(binaryphp_macs());'
Array ( [0] => aa:bb:cc:dd:ee:ff )

Ou ouvrez n'importe quelle page phpinfo() dans le navigateur — vous y verrez un bloc BinaryPHP dédié, listant la version du loader, la génération master, les formats supportés, l'état de la VM bytecode. Particulièrement pratique pour les environnements sans CLI (cPanel, Plesk, hébergement partagé) :

BinaryPHP support  →  enabled
Loader version     →  0.9.2
Master gen         →  2 (rotated 2026-05-06)
File formats       →  BPHP2/3/4 · HBPH1/2/3 · BVMC1/2/3
Bytecode VM        →  v3 obfuscation + cranelift JIT

Choisissez la version mineure correspondant à votre PHP (chaque .so est compilé pour son ABI, non interchangeable) :

Exécutez php -v sur votre serveur pour voir la version réelle. macOS / aarch64 / FreeBSD non supportés actuellement.

Développeurs de plugins

Utiliser l'encodeur SaaS

Pas d'installation CLI, pas de garde de clé maître. Ouvrez l'encodeur, téléversez, configurez la licence, téléchargez le fichier chiffré. C'est tout.

  • Salt aléatoire indépendant par fichier + AES-256-GCM
  • Données de licence (domaine · MAC · expiration) scellées dans le chiffrat, non altérables
  • Nom de fichier inchangé (.php.php)
  • Le loader détecte par magic header, indépendamment de l'extension
Ouvrir l'encodeur

Free accepte .php ou .zip, jusqu'à 1 Mo. Pro jusqu'à 100 Mo ; Ultra via multipart jusqu'à 300 Mo.

Questions fréquentes

BinaryPHP est-il vraiment incassable ?

Honnêtement : aucun DRM exécutable hors-ligne ne peut garantir « incassable à jamais ». ionCube, Zend Guard, SourceGuardian ont tous été étudiés et cassés.

L'objectif de BinaryPHP n'est donc pas la « sécurité absolue » mythique, mais :

Rendre le coût du cracking largement supérieur au coût de la licence légitime.

Cracker BinaryPHP n'est pas seulement « déchiffrer un fichier ». Un attaquant doit généralement aussi :

  • Faire de la rétro-ingénierie sur le loader
  • Analyser la logique d'exécution
  • Restaurer le bytecode de la VM
  • Reconstruire le flux du programme obfusqué

Même en cas de succès, ce qu'on obtient n'est généralement pas le code source, mais :

  • Noms de variables perdus
  • Pas de commentaires
  • Flux de contrôle confus
  • Représentation intermédiaire difficile à maintenir

Et BinaryPHP est mis à jour en continu :

  • Loader
  • Jeu d'instructions VM
  • Couches d'obfuscation
  • Anti-debug / Anti-tamper

Les anciens outils de cracking deviennent rapidement obsolètes.

C'est la philosophie centrale de BinaryPHP :

Ne pas rendre le cracking « impossible », mais « non rentable ».

Web ou CLI — quelle licence utiliser ?

Pour les programmes tournant sur un serveur web : liaison au domaine. Le loader vérifie d'abord $_SERVER['SERVER_NAME'] (défini par nginx / Apache, non falsifiable côté client), puis fallback sur HTTP_HOST si absent. Les outils CLI utilisent la liaison à l'adresse MAC. On peut remplir les deux ; un seul match suffit.

Y aura-t-il une perte de performance ?

Non. Le déchiffrement n'a lieu qu'à l'étape de compilation, une fois par fichier. Après compilation, la vitesse d'exécution est identique au PHP natif. Avec OPcache, même ce déchiffrement unique est amorti sur toutes les requêtes suivantes.

La clé maître se trouvera-t-elle sur mon serveur ?

Avec l'encodeur SaaS : non. La clé maître reste toujours de notre côté, et ne fuit pas vers votre environnement.

Quelle différence avec les autres solutions d'encodage ?

BinaryPHP est une nouvelle version construite de zéro en 2026, basée sur de la cryptographie moderne (AES-256-GCM, HKDF-SHA256), avec la logique métier enveloppée dans notre propre VM bytecode. Toolchain en SaaS, clé maître toujours sur notre serveur, format de fichier avec spec publique.

Ça marche sur de l'hébergement partagé ?

L'hôte doit installer le loader BinaryPHP au préalable. Le loader est gratuit et librement redistribuable — vous pouvez demander au client de l'installer lui-même (une ligne dans php.ini) ou demander à l'hébergeur une préinstallation.

Quelles couches de protection BinaryPHP propose-t-il ?

Le loader intègre trois couches de défense indépendantes :

  • Chiffrement authentifié AES-256-GCM + clé dérivée par fichier via HKDF-SHA256. Chaque fichier a son propre salt et sa propre clé — casser un fichier n'affecte pas les autres.
  • Notre propre VM bytecode, dédiée aux fonctions marquées #[binaryphp\Protected]. Ces fonctions sont compilées en notre propre bytecode (ni PHP, ni opcode Zend), interprétées directement par le loader à l'exécution. Le PHP en clair n'apparaît jamais sur le disque du client.
  • Données de licence scellées dans le chiffrat : domaine / MAC / expiration. Toute modification fait échouer le tag GCM et bloque l'exécution.

Les algorithmes les plus sensibles sont à exécuter sur votre propre API serveur ; pour le reste, BinaryPHP fournit une protection multicouche, sans avoir à réécrire tout le programme.

Compatible avec mon framework / autoloader ?

Oui. BinaryPHP intercepte le pipeline de compilation PHP, donc include / require fonctionnent normalement — Composer autoload, routeur de framework, systèmes de plugins, tout fonctionne sans problème.

Compatible avec OPcache ?

Oui. OPcache reprend le cache des résultats de compilation après notre déchiffrement et compilation ; un seul déchiffrement par cycle d'invalidation.

À quoi ressemble le format du fichier ?

Spécification publique et stable : header de 52 octets ("BPHP2" magic + version + 16-byte salt + 12-byte IV + 16-byte GCM tag), suivi du chiffrat.

Quels moyens de paiement supportez-vous ?

La facturation passe entièrement par Stripe, au choix :

  • Abonnement mensuel — Pro $5/mois, Ultra $10/mois, annulable à tout moment.
  • Abonnement annuel — mêmes plans en annuel, automatiquement -20% (Pro $48/an, Ultra $96/an).

Les abonnements bénéficient d'une garantie de remboursement de 30 jours. Stripe accepte toutes les principales cartes de crédit et de nombreux moyens de paiement régionaux.

Quelqu'un peut-il faire planter votre système avec un PHP malveillant ?

Architecturalement non. Nous n'exécutons pas le PHP que vous téléversez ; nous nous contentons de le tokeniser (découpage syntaxique) et de le chiffrer. L'encodeur applique token_get_all() (le lexeur de PHP, pas l'exécuteur) au fichier, sépare HTML et blocs PHP, chiffre chaque bloc PHP en AES et écrit le fichier. Aucun eval, include, ni appel à un shell n'est utilisé dans tout le processus.

L'upload de zip ajoute quatre lignes de défense (vérification avant extraction) :

  • Bloque les attaques path traversal (../, chemins absolus, lettres de lecteur)
  • Bloque les zip bombs (extraction cumulée > 200 Mo ou ratio de compression > 100×)
  • Bloque les entrées trop nombreuses (> 2 000 fichiers, ou > 1 000 .php à l'intérieur)
  • Bloque les répertoires trop profonds (> 16 niveaux)

Chaque tâche d'encodage tourne dans un répertoire temporaire isolé, nettoyé immédiatement après l'envoi de la réponse. Vous pouvez téléverser n'importe quel code malveillant — nous le chiffrons et vous le rendons.

Comment fonctionne le plan API ?

Pour les ISV / SaaS qui revendent des plugins PHP chiffrés. Une fois que le client commande chez vous :

  1. Votre serveur fait un POST vers notre API REST avec le domaine / MAC du client, les paramètres d'encodage, l'URL du webhook.
  2. Nous récupérons la source depuis l'URL fournie (ou acceptons inline), encodons et téléversons sur R2.
  3. Nous faisons un POST du lien de téléchargement vers votre webhook configuré.
  4. Vous transmettez le lien au client (e-mail, dashboard, peu importe).

Les résultats d'encodage restent 72 heures sur R2 puis sont supprimés automatiquement ; les sources que vous téléversez sont supprimées sous 24 heures.

Clients qui livrent avec BinaryPHP

Arrêtez de livrer votre code source avec.

Connectez-vous avec Google et commencez — version gratuite immédiatement utilisable, sans carte bancaire.