Skip to Content
Neue Version 12 verfügbar 🎉
LicensingExterner verschlüsselter Code

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.git

ReportTool 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.dll

Die vier Kombinationen machen die Sperre mit zwei Faktoren sichtbar:

Lizenzpremium.eil ausgeliefertErgebnis
StandardneinPremium gesperrt
PremiumneinPremium gesperrt: Funktion nicht ausgeliefert
StandardjaPremium gesperrt: nicht lizenziert
PremiumjaPremium-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.

Last updated on