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 des fonctionnalités précises de votre application en fonction de la clé de licence fournie.
L’une des façons de procéder consiste à combiner le chiffrement du code et Babel Licensing. Vous chiffrez votre code avec Babel Obfuscator, puis vous générez une clé de licence qui déverrouille certaines sections chiffrées du code. Vous pouvez ainsi proposer 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 mettre cela en œuvre, vous utilisez Babel Licensing pour générer les clés de licence et 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.gitL’exemple référence le package NuGet Babel Licensing pour utiliser ses fonctionnalités. Son code comprend 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 précises.
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 comprend aussi le code qui génère un fichier de licence XML contenant les informations de licence, telles que la date d’expiration, les fonctionnalités sous licence et les informations sur le produit.
Notez que le code de génération de licence fourni dans l’exemple sert uniquement à la démonstration et ne doit pas être inclus en production.
Le chiffrement du code peut servir à empêcher que le code des fonctionnalités d’une application soit utilisé sans le fichier de licence approprié. Pour cela, le code qui implémente une fonctionnalité donnée est chiffré, et un mot de passe est exigé 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 être obtenu à partir d’un fichier de licence généré en fonction des fonctionnalités dont l’utilisateur a acquis la licence.
Babel Obfuscator utilise l’attribut Obfuscation pour marquer le code de la fonctionnalité à protéger et pour indiquer 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 récupère le mot de passe dans un fichier de licence ou auprès 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 sous licence puissent accéder à 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é, ouvrez le projet d’obfuscation obfuscate.babel dans Babel Desktop et exécutez-le pour protéger les fonctionnalités de l’application avec le chiffrement du code.
Vous pouvez lancer l’application protégée et générer une licence pour les 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. Une licence pour l’édition Enterprise déverrouille donc 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 les fonctionnalités activées, l’application autorise l’utilisateur à y accéder.
Dans l’ensemble, le chiffrement du code associé à 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.