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.gitReportTool 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.dllLas cuatro combinaciones dejan ver la condición de dos factores:
| Licencia | premium.eil entregado | Resultado |
|---|---|---|
| Standard | no | Premium bloqueado |
| Premium | no | Premium bloqueado: la función no se ha entregado |
| Standard | sí | Premium bloqueado: sin licencia para la función |
| Premium | sí | 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.