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.gitReportTool 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.dllLes quatre combinaisons mettent en évidence ce contrôle à deux facteurs :
| Licence | premium.eil livré | Résultat |
|---|---|---|
| Standard | non | Premium bloqué |
| Premium | non | Premium bloqué : fonctionnalité non livrée |
| Standard | oui | Premium bloqué : non couvert par la licence |
| Premium | oui | L’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.