Einen Algorithmus mit Codeverschlüsselung schützen
Ein proprietärer Algorithmus ist oft das Wertvollste in einer Assembly, und zugleich das, was sich am leichtesten direkt aus einem Decompiler entnehmen lässt. Dieses Beispiel wendet mit dem NuGet-Paket von Babel Obfuscator die MSIL-Codeverschlüsselung über eine einzige MSBuild-Eigenschaft auf eine Scoring-Engine an. Es ist die einfachste Einrichtung der Codeverschlüsselung: ohne Babel Licensing und ohne Lizenz zur Laufzeit, denn die Standard-Codeverschlüsselung bettet den Schlüssel in die Binärdatei ein, und die geschützte Anwendung läuft eigenständig.
Für dieses Beispiel brauchen Sie eine Standortlizenz für Babel Obfuscator (Edition Ultimate, Server oder Data Center). Der Quellcode ist auf GitHub verfügbar:
git clone https://github.com/babelfornet/code-encryption-nuget-example.gitDer geschützte Code ist ein proprietärer Scoring-Algorithmus (src/AlgorithmApp/ScoringEngine.cs),
also die Art von geistigem Eigentum, die kein Wettbewerber aus einem Decompiler entnehmen soll:
internal static class ScoringEngine
{
public static int Score(int recency, int frequency, int monetary)
{
int r = Bucket(recency, 3, 12, 30);
int f = Bucket(frequency, 2, 5, 12);
int m = Bucket(monetary, 50, 250, 1000);
return Normalize(r * 25 + f * 17 + m * 11); // vendor's secret weighting
}
// Bucket / Normalize …
}Nach der Verschlüsselung sind die Rümpfe von Score, Bucket und Normalize aus dem IL-Code
verschwunden und werden nur zur Laufzeit von der Babel Virtual Machine wiederhergestellt. Das
Konsolenprojekt AlgorithmApp verschlüsselt den sensiblen Typ in der Konfiguration Release:
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Babel.Obfuscator" Version="12.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<MsilEncryption>AlgorithmApp\.ScoringEngine::.*</MsilEncryption>
<BabelWarningsAsErrors>W00000</BabelWarningsAsErrors>
</PropertyGroup>MsilEncryption ist ein regulärer Ausdruck, der die zu verschlüsselnden Methoden auswählt, hier alle
Methoden des Typs ScoringEngine. Babel schreibt diese Methodenrümpfe in eigene verschlüsselte
Anweisungen um, die nur die Babel Virtual Machine ausführen kann.
Das ist die Standard-Codeverschlüsselung (ohne <Source>). Eine Babel-Lizenz ist daher nur beim
Build erforderlich, und die geschützte Anwendung läuft eigenständig.
Ein Build des Beispiels in Release verschlüsselt die drei Scoring-Methoden bei identischer Programmausgabe, und der IL-Code des Algorithmus ist in der Assembly nicht mehr vorhanden. Wie sich der verschlüsselte Code nur mit einer gültigen Lizenz freischalten lässt, sodass es nicht genügt, die Lizenzprüfung zu entfernen, zeigen die folgenden Lizenzierungsbeispiele.