Proteggere un algoritmo con la cifratura del codice
Un algoritmo proprietario è spesso la cosa di maggior valore in un assembly, e la più facile da estrarre direttamente da un decompilatore. Questo esempio usa il pacchetto NuGet di Babel Obfuscator per applicare la cifratura del codice MSIL a un motore di calcolo del punteggio con una sola proprietà MSBuild. È la configurazione più semplice della cifratura del codice: niente Babel Licensing e nessuna licenza in fase di esecuzione, perché la cifratura del codice predefinita incorpora la chiave nel file binario e l’applicazione protetta funziona da sola.
Per usare questo esempio ti serve una licenza per sede di Babel Obfuscator (edizioni Ultimate, Server o Data Center). Il codice sorgente è disponibile su GitHub:
git clone https://github.com/babelfornet/code-encryption-nuget-example.gitIl codice protetto è un algoritmo proprietario di calcolo del punteggio
(src/AlgorithmApp/ScoringEngine.cs), il genere di proprietà intellettuale che non vuoi che un
concorrente estragga da un decompilatore:
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 …
}Dopo la cifratura, i corpi di Score, Bucket e Normalize non sono più nell’IL e vengono
ricostruiti solo dalla Babel Virtual Machine in fase di esecuzione. Il progetto console
AlgorithmApp cifra il tipo sensibile in 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 è un’espressione regolare che seleziona i metodi da cifrare: qui tutti i metodi del
tipo ScoringEngine. Babel riscrive i corpi di quei metodi in istruzioni cifrate personalizzate che
solo la Babel Virtual Machine può eseguire. Questa è la cifratura
del codice predefinita (senza <Source>), quindi una licenza Babel è richiesta solo in fase di
build; l’applicazione protetta funziona da sola.
La build dell’esempio in Release cifra i tre metodi di calcolo del punteggio, con un output del programma identico, e l’IL dell’algoritmo non è più presente nell’assembly. Per fare in modo che il codice cifrato si sblocchi solo con una licenza valida, così che rimuovere il controllo della licenza non basti, vedi gli esempi sulle licenze più sotto.