Protección de un algoritmo con cifrado de código
Un algoritmo propietario suele ser lo más valioso de un ensamblado, y también lo más fácil de extraer directamente con un descompilador. Este ejemplo usa el paquete NuGet de Babel Obfuscator para aplicar el cifrado de código MSIL a un motor de puntuación con una sola propiedad de MSBuild. Es la configuración de cifrado de código más sencilla: sin Babel Licensing y sin licencia en tiempo de ejecución, porque el cifrado de código predeterminado incrusta la clave en el binario y la aplicación protegida se ejecuta por sí sola.
Para usar este ejemplo necesita una licencia de sitio de Babel Obfuscator (ediciones Ultimate, Server o Data Center). El código fuente está disponible en GitHub:
git clone https://github.com/babelfornet/code-encryption-nuget-example.gitEl código protegido es un algoritmo de puntuación propietario (src/AlgorithmApp/ScoringEngine.cs),
el tipo de propiedad intelectual que no conviene que un competidor extraiga con un descompilador:
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 …
}Tras el cifrado, los cuerpos de Score, Bucket y Normalize desaparecen del IL y solo la máquina
virtual de Babel los reconstruye en tiempo de ejecución. El proyecto de consola AlgorithmApp cifra
el tipo 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 es una expresión regular que selecciona los métodos que se cifran, en este caso
todos los métodos del tipo ScoringEngine. Babel reescribe los cuerpos de esos métodos como
instrucciones cifradas personalizadas que solo la máquina virtual de Babel
puede ejecutar. Este es el cifrado de código predeterminado (sin <Source>), de modo que la licencia
de Babel solo se necesita en tiempo de compilación; la aplicación protegida se ejecuta de forma
independiente.
Al compilar el ejemplo en Release se cifran los tres métodos de puntuación sin que cambie la salida del programa, y el IL del algoritmo deja de estar presente en el ensamblado. Para que el código cifrado solo se desbloquee con una licencia válida, de modo que no baste con eliminar la comprobación de la licencia, consulte los ejemplos de licencias que siguen.