Skip to Content
Nueva versión 12 disponible 🎉
LicensingCódigo externo cifrado

Función como archivo externo cifrado

Distribuya una función premium como código cifrado que está fuera de la aplicación y que solo se desbloquea cuando el cliente tiene además una licencia que la concede.

Babel Obfuscator puede extraer el cuerpo cifrado de un método a un archivo binario aparte, con la extensión .eil, en lugar de incrustarlo en el ensamblado (consulte Archivos de código externos). Ese archivo se puede desplegar de forma independiente, por ejemplo entregándolo junto con una licencia en el momento en que un cliente actualiza a una edición superior. Este ejemplo combina las dos cosas: el código premium es un archivo .eil externo, y para ejecutarlo hacen falta tanto el archivo como una licencia de Babel válida que conceda la función.

Ejemplo de código

git clone https://github.com/babelfornet/external-encrypted-code-console-example.git

ReportTool es una aplicación de consola con un informe Standard gratuito y un análisis Premium. El código Premium se cifra en premium.eil; LicenseGenerator emite una licencia Standard o una Premium.

Cifrado externo

El método premium establece un source pero no internal, así que Babel escribe su cuerpo cifrado en un archivo externo premium.eil:

[Obfuscation(Feature = "msil encryption:source=premium;password=Pr3m!um-R3port-K3y", Exclude = false)] public static string Analyze(int[] data) { double mean = data.Average(); double variance = data.Select(x => (x - mean) * (x - mean)).Sum() / data.Length; return $"Premium analysis: mean={mean:0.00}, variance={variance:0.00}, stddev={Math.Sqrt(variance):0.00}"; }

Babel emite premium.eil junto al ensamblado intermedio. Un breve destino de MSBuild lo copia a la carpeta de salida para que se pueda desplegar con la aplicación, o dejarse fuera de ella a propósito:

<Target Name="CopyBabelExternalFiles" AfterTargets="Build"> <ItemGroup> <BabelEilFiles Include="$(IntermediateOutputPath)*.eil" /> </ItemGroup> <Copy SourceFiles="@(BabelEilFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="false" Condition="'@(BabelEilFiles)' != ''" /> </Target>

Dos hooks condicionados a la licencia

Para el código externo, la BVM llama a dos hooks: uno para obtener la secuencia cifrada y otro para la contraseña. Este ejemplo condiciona los dos a una licencia válida, de modo que no basta ni con el archivo solo ni con la licencia sola:

// Returns the .eil stream only when a valid license grants the feature. [Obfuscation(Feature = "msil encryption get stream")] internal static Stream? GetSourceStream(string source) { if (!HasFeature(source)) return null; // Not licensed for this feature. var path = Path.Combine(FeaturesDirectory, source + ".eil"); return File.Exists(path) ? File.OpenRead(path) : null; // Feature file not delivered. } // Returns the password carried by the license. [Obfuscation(Feature = "msil encryption get password")] internal static string GetSourcePassword(string source) { var license = Validate(); var field = license.Fields.FirstOrDefault(f => f.Name == source) ?? throw new InvalidOperationException($"License does not grant source '{source}'."); return field.Value.Decrypt(Secrets.FieldSecret); }

HasFeature devuelve true solo cuando la licencia validada lleva un campo con el nombre de la función, que el generador añade en una licencia Premium:

if (premium) { string encrypted = Secrets.PremiumPassword.Encrypt(Secrets.FieldSecret); builder = builder.WithField(Secrets.PremiumSource, encrypted); }

Ejecución

# Build in Release — Babel encrypts Premium.Analyze into premium.eil. dotnet build src/ReportTool/ReportTool.csproj -c Release # Mint a Premium license (add --standard for a Standard one). dotnet run --project src/LicenseGenerator # Deliver BOTH the license and the external code, then run. cp ReportTool.lic src/ReportTool/bin/Release/net8.0/ dotnet src/ReportTool/bin/Release/net8.0/ReportTool.dll

Las cuatro combinaciones dejan ver la condición de dos factores:

Licenciapremium.eil entregadoResultado
StandardnoPremium bloqueado
PremiumnoPremium bloqueado: la función no se ha entregado
StandardsíPremium bloqueado: sin licencia para la función
PremiumsíEl análisis Premium se ejecuta

Cuando falta cualquiera de los dos factores, la BVM indica no code source premium stream y el informe Standard sigue funcionando por su cuenta.

Entregar el código protegido como un archivo aparte encaja de forma natural con las licencias basadas en funciones y de módulos adicionales: la aplicación base es una descarga, y cada función de pago es un pequeño archivo .eil que se distribuye junto con la licencia que lo desbloquea. El proveedor de software puede revocar una función simplemente no renovando la licencia que la concede.

keys.pem y las contraseñas del ejemplo son solo para demostración. En producción la licencia la emite el proveedor de software o el Babel Licensing Service, y la clave privada RSA se mantiene sin conexión.

Last updated on