Funktion als externe verschlüsselte Datei
Liefern Sie eine Premium-Funktion als verschlüsselten Code aus, der außerhalb der Anwendung liegt und nur freigeschaltet wird, wenn der Kunde auch eine Lizenz besitzt, die sie gewährt.
Babel Obfuscator kann den verschlüsselten Rumpf einer Methode in eine separate Binärdatei mit der
Erweiterung .eil auslagern, statt ihn in die Assembly einzubetten (siehe
Externe Codedateien). Diese Datei lässt sich
unabhängig bereitstellen, zum Beispiel zusammen mit einer Lizenz in dem Moment, in dem ein Kunde
ein Upgrade durchführt. Dieses Beispiel verbindet beides: Der Premium-Code ist eine externe Datei .eil, und
um ihn auszuführen, sind sowohl die Datei als auch eine gültige Babel-Lizenz nötig, die die Funktion gewährt.
Codebeispiel
git clone https://github.com/babelfornet/external-encrypted-code-console-example.gitReportTool ist eine Konsolenanwendung mit einem kostenlosen Standard-Bericht und einer Premium-Analyse. Der
Premium-Code wird in premium.eil verschlüsselt. LicenseGenerator stellt entweder eine Standard- oder eine
Premium-Lizenz aus.
Externe Verschlüsselung
Die Premium-Methode setzt eine source, aber nicht internal. Babel schreibt ihren verschlüsselten Rumpf daher in
eine externe Datei 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 legt premium.eil neben der Zwischen-Assembly ab. Ein kurzes MSBuild-Ziel kopiert die Datei in
den Ausgabeordner, damit sie mit der Anwendung bereitgestellt oder ihr bewusst vorenthalten werden kann:
<Target Name="CopyBabelExternalFiles" AfterTargets="Build">
<ItemGroup>
<BabelEilFiles Include="$(IntermediateOutputPath)*.eil" />
</ItemGroup>
<Copy SourceFiles="@(BabelEilFiles)" DestinationFolder="$(OutDir)"
SkipUnchangedFiles="false" Condition="'@(BabelEilFiles)' != ''" />
</Target>Zwei lizenzabhängige Hooks
Für externen Code ruft die BVM zwei Hooks auf: einen, um den verschlüsselten Datenstrom zu erhalten, und einen für das Passwort. Dieses Beispiel macht beide von einer gültigen Lizenz abhängig, sodass weder die Datei allein noch die Lizenz allein genügt:
// 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 gibt nur dann true zurück, wenn die validierte Lizenz ein Feld mit dem Namen der Funktion
enthält, und dieses Feld fügt der Generator bei einer Premium-Lizenz hinzu:
if (premium)
{
string encrypted = Secrets.PremiumPassword.Encrypt(Secrets.FieldSecret);
builder = builder.WithField(Secrets.PremiumSource, encrypted);
}Ausführen
# 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.dllDie vier Kombinationen machen die Sperre mit zwei Faktoren sichtbar:
| Lizenz | premium.eil ausgeliefert | Ergebnis |
|---|---|---|
| Standard | nein | Premium gesperrt |
| Premium | nein | Premium gesperrt: Funktion nicht ausgeliefert |
| Standard | ja | Premium gesperrt: nicht lizenziert |
| Premium | ja | Premium-Analyse läuft |
Fehlt einer der beiden Faktoren, meldet die BVM no code source premium stream, und der Standard-Bericht
funktioniert für sich weiter.
Geschützten Code als separate Datei auszuliefern, passt gut zur funktionsbasierten Lizenzierung und zur
Lizenzierung von Add-ons: Die Basisanwendung ist ein einziger Download, und jede kostenpflichtige Funktion ist eine kleine Datei .eil,
die zusammen mit der Lizenz ausgeliefert wird, die sie freischaltet. Der Hersteller kann eine Funktion widerrufen, indem er die
Lizenz, die sie gewährt, einfach nicht verlängert.
keys.pem und die Passwörter im Beispiel dienen nur der Demonstration. In der Produktion stellt der
Hersteller oder der Babel Licensing Service die Lizenz aus,
und der private RSA-Schlüssel wird offline aufbewahrt.