Skip to Content
Nouvelle version 12 disponible 🎉
LicensingLicences basées sur des fonctionnalités

Licences basées sur des fonctionnalités

Babel Obfuscator comprend une fonctionnalité de gestion des licences qui vous permet de générer des licences basées sur des fonctionnalités pour votre code obfusqué. Vous pouvez ainsi créer des licences qui déverrouillent certaines fonctionnalités de votre application en fonction de la clé de licence fournie.

L’une des façons d’y parvenir consiste à associer le chiffrement du code à Babel Licensing. Vous pouvez chiffrer votre code avec Babel Obfuscator, puis générer une clé de licence qui déverrouille certaines sections chiffrées du code. Vous proposez ainsi différents niveaux de licence ou ensembles de fonctionnalités selon les besoins de l’utilisateur.

Supposons par exemple que votre application comporte trois niveaux de fonctionnalités : Standard, Professional et Enterprise. Vous pouvez chiffrer les fonctionnalités Enterprise de l’application avec Babel Obfuscator, puis générer une clé de licence qui les déverrouille. Vous fournissez ensuite aux utilisateurs des clés de licence différentes selon leur niveau d’abonnement, chaque clé déverrouillant l’ensemble de fonctionnalités correspondant.

Pour cela, vous utilisez Babel Licensing afin de générer les clés de licence et de les vérifier à l’exécution. Lorsque l’utilisateur saisit une clé de licence, votre application la valide avec Babel Licensing et détermine les fonctionnalités à déverrouiller. Les sections chiffrées du code sont alors déchiffrées et mises à la disposition de l’utilisateur.

Le code source de l’exemple qui illustre les licences basées sur des fonctionnalités avec le chiffrement du code est disponible sur GitHub :

git clone https://github.com/babelfornet/license-features-example.git

L’exemple référence le package NuGet Babel Licensing pour en utiliser les fonctionnalités. Le code de l’exemple contient une implémentation de la classe LicenseManager, qui fournit des méthodes pour vérifier la validité d’une licence et la présence de fonctionnalités données.

public ILicense ValidateLicense() { // To validate the license, only the public key is required. // The private key is only used to sign the license, and in production the private key // should not be distributed with the application. // The public key should be distributed with the application and used to validate the license. // The following signature provider can be used to create and validate the license // as includes both the private key and the public key. var signature = CreateSignature(); // The public key string can be embedded into the application and used to create a signature // provider used only to validate the license. string publicKey = signature.ExportKeys(publicKeyOnly: true); // To create the RSASignature from the public key use the following code var validatingSignature = RSASignature.FromKeys(publicKey); // And assign the validating signature provider to the license manager var licenseManager = new XmlLicenseManager(); licenseManager.SignatureProvider = validatingSignature; license = licenseManager.Validate(File.ReadAllText(LicenseFileName), typeof(LicenseManager), this); return license; }

L’exemple contient aussi le code qui génère un fichier de licence XML indiquant les informations de la licence, comme la date d’expiration, les fonctionnalités sous licence et les informations sur le produit.

Notez que le code fourni dans l’exemple pour générer la licence sert uniquement à la démonstration et ne doit pas être inclus en production.

Le chiffrement du code permet d’empêcher que le code des fonctionnalités d’une application soit utilisé sans le fichier de licence approprié. Il suffit pour cela de chiffrer le code qui implémente une fonctionnalité donnée et d’exiger un mot de passe pour le déchiffrer et l’exécuter.

[Obfuscation(Feature = "msil encryption:internal=true;source=feature1;cache=false;password=aR&tj4i7u@", Exclude = false)] internal class Feature1 { public Feature1() { } public string DoTask() { return "Feature1: " + Add(7, 8); } public int Add(int a, int b) => a + b; }

Le mot de passe peut provenir d’un fichier de licence généré en fonction des fonctionnalités pour lesquelles l’utilisateur détient une licence.

Babel Obfuscator utilise l’attribut Obfuscation pour marquer le code de la fonctionnalité à protéger et pour désigner la méthode à appeler à l’exécution afin de récupérer le mot de passe nécessaire au déchiffrement et à l’exécution du code protégé. Cette méthode est généralement une petite fonction qui lit le mot de passe dans un fichier de licence ou l’obtient d’un serveur de licences. Babel Obfuscator utilise ensuite ce mot de passe pour déchiffrer le code protégé à l’exécution, de sorte que seuls les utilisateurs disposant d’une licence accèdent à la fonctionnalité.

[Obfuscation(Feature = "msil encryption get password")] internal static string GetSourcePassword(string source) { var lm = LicenseManager.Instance; var feature = lm.License.Features.FirstOrDefault(item => item.Name == source); if (feature == null) throw new ApplicationException(source + " not found"); return Encoding.UTF8.GetString(feature.Data); }

Une fois l’exemple compilé, exécutez le projet d’obfuscation Obfuscate.babel dans Babel Desktop ou depuis la ligne de commande avec babel --project Obfuscate.babel pour protéger les fonctionnalités de l’application avec le chiffrement du code.

Les statistiques d’obfuscation indiquent les méthodes chiffrées pour chaque source de fonctionnalité, par exemple feature1. Dans Babel Desktop, les statistiques de chiffrement du code répertorient chaque méthode chiffrée avec sa source.

Vous pouvez démarrer l’application protégée et générer une licence pour chacune des trois éditions proposées : Standard, Professional et Enterprise. Chaque édition déverrouille un nombre croissant de fonctionnalités : plus l’édition sous licence est élevée, plus vous pouvez utiliser de fonctionnalités dans l’application. Ainsi, une licence pour l’édition Enterprise déverrouille toutes les fonctionnalités, tandis qu’une licence pour l’édition Standard n’en déverrouille qu’une partie.

Fonctionnalités sous licence

La classe LicenseManager vérifie la présence d’une licence valide et des fonctionnalités demandées. Si la licence est valide et que les fonctionnalités sont activées, l’application permet à l’utilisateur d’y accéder.

Dans l’ensemble, associer le chiffrement du code à Babel Licensing permet de créer des applications flexibles et riches en fonctionnalités, tout en protégeant votre code contre la rétro-ingénierie et le piratage.

Last updated on