Skip to Content
Nuova versione 12 disponibile 🎉
ObfuscatorCifratura del codiceProteggere un algoritmo

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

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

Last updated on