Protéger un algorithme avec le chiffrement du code
Un algorithme propriétaire est souvent ce qu’un assembly contient de plus précieux, et ce qu’il est le plus facile d’extraire directement d’un décompilateur. Cet exemple utilise le package NuGet Babel Obfuscator pour appliquer le chiffrement du code MSIL à un moteur de calcul de score avec une seule propriété MSBuild. C’est la configuration de chiffrement du code la plus simple : pas de Babel Licensing ni de licence à l’exécution, car le chiffrement du code par défaut incorpore la clé dans le binaire et l’application protégée s’exécute de façon autonome.
Pour utiliser cet exemple, vous avez besoin d’une licence de site pour Babel Obfuscator (édition Ultimate, Server ou Data Center). Le code source est disponible sur GitHub :
git clone https://github.com/babelfornet/code-encryption-nuget-example.gitLe code protégé est un algorithme propriétaire de calcul de score
(src/AlgorithmApp/ScoringEngine.cs), le genre de propriété intellectuelle que vous ne voulez pas
voir un concurrent extraire d’un décompilateur :
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 …
}Après le chiffrement, les corps de Score, Bucket et Normalize ont disparu de l’IL et ne sont
reconstruits que par la machine virtuelle Babel, à l’exécution. Le projet console AlgorithmApp
chiffre le type sensible en 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 est une expression régulière qui sélectionne les méthodes à chiffrer, ici toutes
les méthodes du type ScoringEngine. Babel réécrit ces corps de méthode en instructions chiffrées
personnalisées que seule la machine virtuelle Babel peut exécuter.
Il s’agit du chiffrement du code par défaut (sans <Source>) : une licence Babel n’est donc requise
qu’à la génération, et l’application protégée s’exécute de façon autonome.
Générer l’exemple en Release chiffre les trois méthodes de calcul de score sans modifier la sortie du programme, et l’IL de l’algorithme n’est plus présent dans l’assembly. Pour que le code chiffré ne se déverrouille qu’avec une licence valide, de sorte que supprimer le contrôle de licence ne suffise pas, voir les exemples consacrés aux licences ci-dessous.