Skip to Content
Nouvelle version 12 disponible 🎉
LicensingCode chiffré externe

Fonctionnalité sous forme de fichier chiffré externe

Livrer une fonctionnalité premium sous forme de code chiffré qui réside hors de l’application et n’est déverrouillé que si le client détient aussi une licence qui l’accorde.

Babel Obfuscator peut extraire le corps chiffré d’une méthode dans un fichier binaire distinct portant l’extension .eil, au lieu de l’incorporer dans l’assembly (voir Fichiers de code externes). Ce fichier peut être déployé indépendamment, par exemple livré avec une licence au moment où un client effectue une mise à niveau. Cet exemple combine les deux : le code premium est un fichier .eil externe, et il faut à la fois le fichier et une licence Babel valide accordant la fonctionnalité pour l’exécuter.

Exemple de code

git clone https://github.com/babelfornet/external-encrypted-code-console-example.git

ReportTool est une application console qui propose un rapport Standard gratuit et une analyse Premium. Le code Premium est chiffré dans premium.eil ; LicenseGenerator émet une licence Standard ou une licence Premium.

Chiffrement externe

La méthode premium définit source mais pas internal, si bien que Babel écrit son corps chiffré dans un fichier externe premium.eil :

[Obfuscation(Feature = "msil encryption:source=premium;password=Pr3m!um-R3port-K3y", Exclude = false)] public static string Analyze(int[] data) { double mean = data.Average(); double variance = data.Select(x => (x - mean) * (x - mean)).Sum() / data.Length; return $"Premium analysis: mean={mean:0.00}, variance={variance:0.00}, stddev={Math.Sqrt(variance):0.00}"; }

Babel produit premium.eil à côté de l’assembly intermédiaire. Une courte cible MSBuild le copie dans le dossier de sortie, afin qu’il puisse être déployé avec l’application ou délibérément tenu à l’écart de celle-ci :

<Target Name="CopyBabelExternalFiles" AfterTargets="Build"> <ItemGroup> <BabelEilFiles Include="$(IntermediateOutputPath)*.eil" /> </ItemGroup> <Copy SourceFiles="@(BabelEilFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="false" Condition="'@(BabelEilFiles)' != ''" /> </Target>

Deux hooks soumis à la licence

Pour le code externe, la BVM appelle deux hooks : l’un pour obtenir le flux chiffré, l’autre pour le mot de passe. Cet exemple soumet les deux à une licence valide, de sorte que ni le fichier seul ni la licence seule ne suffisent :

// Returns the .eil stream only when a valid license grants the feature. [Obfuscation(Feature = "msil encryption get stream")] internal static Stream? GetSourceStream(string source) { if (!HasFeature(source)) return null; // Not licensed for this feature. var path = Path.Combine(FeaturesDirectory, source + ".eil"); return File.Exists(path) ? File.OpenRead(path) : null; // Feature file not delivered. } // Returns the password carried by the license. [Obfuscation(Feature = "msil encryption get password")] internal static string GetSourcePassword(string source) { var license = Validate(); var field = license.Fields.FirstOrDefault(f => f.Name == source) ?? throw new InvalidOperationException($"License does not grant source '{source}'."); return field.Value.Decrypt(Secrets.FieldSecret); }

HasFeature ne renvoie true que si la licence validée contient un champ portant le nom de la fonctionnalité, que le générateur ajoute pour une licence Premium :

if (premium) { string encrypted = Secrets.PremiumPassword.Encrypt(Secrets.FieldSecret); builder = builder.WithField(Secrets.PremiumSource, encrypted); }

Exécuter l’exemple

# Build in Release — Babel encrypts Premium.Analyze into premium.eil. dotnet build src/ReportTool/ReportTool.csproj -c Release # Mint a Premium license (add --standard for a Standard one). dotnet run --project src/LicenseGenerator # Deliver BOTH the license and the external code, then run. cp ReportTool.lic src/ReportTool/bin/Release/net8.0/ dotnet src/ReportTool/bin/Release/net8.0/ReportTool.dll

Les quatre combinaisons mettent en évidence ce contrôle à deux facteurs :

Licencepremium.eil livréRésultat
StandardnonPremium bloqué
PremiumnonPremium bloqué : fonctionnalité non livrée
StandardouiPremium bloqué : non couvert par la licence
PremiumouiL’analyse Premium s’exécute

Lorsque l’un des deux facteurs manque, la BVM signale no code source premium stream et le rapport Standard continue de fonctionner seul.

Livrer le code protégé dans un fichier distinct convient bien aux licences basées sur des fonctionnalités et aux modules complémentaires : l’application de base est un seul téléchargement, et chaque fonctionnalité payante est un petit fichier .eil fourni avec la licence qui le déverrouille. L’éditeur peut révoquer une fonctionnalité en ne renouvelant pas la licence qui l’accorde.

keys.pem et les mots de passe de l’exemple servent uniquement à la démonstration. En production, la licence est émise par l’éditeur ou par le Babel Licensing Service, et la clé privée RSA est conservée hors ligne.

Last updated on