Licencias basadas en funciones
Babel Obfuscator incluye una función de licencias que permite generar licencias basadas en funciones para su código ofuscado. Esto significa que puede crear licencias que desbloqueen funciones o funcionalidades concretas de su aplicación según la clave de licencia que se proporcione.
Una forma de implementarlo es usar el cifrado de código en combinación con Babel Licensing. Puede usar Babel Obfuscator para cifrar el código y generar después una clave de licencia que desbloquee secciones cifradas concretas del código. De este modo puede ofrecer distintos niveles de licencia o conjuntos de funciones según las necesidades del usuario.
Por ejemplo, suponga que tiene una aplicación con tres niveles de funcionalidad: Standard, Professional y Enterprise. Puede usar Babel Obfuscator para cifrar las funciones Enterprise de la aplicación y generar después una clave de licencia que las desbloquee. A continuación puede entregar claves de licencia distintas a los usuarios según su nivel de suscripción, de modo que cada clave desbloquee el conjunto de funciones correspondiente.
Para implementarlo, se usa Babel Licensing para generar las claves de licencia y verificarlas en tiempo de ejecución. Cuando el usuario introduce una clave de licencia, la aplicación usa Babel Licensing para validarla y determinar qué funciones deben desbloquearse. Las secciones cifradas del código se descifran entonces y quedan a disposición del usuario.
El código fuente del ejemplo que muestra las licencias basadas en funciones con cifrado de código está disponible en GitHub
git clone https://github.com/babelfornet/license-features-example.gitEl ejemplo hace referencia al paquete NuGet de Babel Licensing para usar sus funciones. El código del ejemplo incluye una implementación de la clase LicenseManager, que proporciona métodos para comprobar la validez de una licencia y la presencia de funciones concretas.
public ILicense ValidateLicense()
{
// To validate the license, only the public key is required.
// The private key is only used to sign the license, and in production the private key
// should not be distributed with the application.
// The public key should be distributed with the application and used to validate the license.
// The following signature provider can be used to create and validate the license
// as includes both the private key and the public key.
var signature = CreateSignature();
// The public key string can be embedded into the application and used to create a signature
// provider used only to validate the license.
string publicKey = signature.ExportKeys(publicKeyOnly: true);
// To create the RSASignature from the public key use the following code
var validatingSignature = RSASignature.FromKeys(publicKey);
// And assign the validating signature provider to the license manager
var licenseManager = new XmlLicenseManager();
licenseManager.SignatureProvider = validatingSignature;
license = licenseManager.Validate(File.ReadAllText(LicenseFileName), typeof(LicenseManager), this);
return license;
}El ejemplo incluye también el código para generar un archivo de licencia XML que especifica la información de la licencia, como la fecha de caducidad, las funciones con licencia y la información del producto.
Tenga en cuenta que el código que el ejemplo ofrece para generar la licencia solo sirve como demostración y no debe incluirse en producción.
El cifrado de código puede usarse para impedir que el código que compone las funciones de una aplicación de software se use sin el archivo de licencia adecuado. Para ello se cifra el código que implementa una función determinada y se exige una contraseña para descifrarlo y ejecutarlo.
[Obfuscation(Feature = "msil encryption:internal=true;source=feature1;cache=false;password=aR&tj4i7u@", Exclude = false)]
internal class Feature1
{
public Feature1() { }
public string DoTask()
{
return "Feature1: " + Add(7, 8);
}
public int Add(int a, int b) => a + b;
}La contraseña puede obtenerse de un archivo de licencia que se genera según las funciones que el usuario ha licenciado.
Babel Obfuscator usa el atributo Obfuscation para marcar el código que compone la función que se va a proteger y para indicar el método al que debe llamarse en tiempo de ejecución para obtener la contraseña necesaria para descifrar y ejecutar el código protegido. Este método suele ser una función pequeña que obtiene la contraseña de un archivo de licencia o de un servidor de licencias. Babel Obfuscator usa después la contraseña para descifrar el código protegido en tiempo de ejecución, lo que garantiza que solo los usuarios con licencia puedan acceder a la función.
[Obfuscation(Feature = "msil encryption get password")]
internal static string GetSourcePassword(string source)
{
var lm = LicenseManager.Instance;
var feature = lm.License.Features.FirstOrDefault(item => item.Name == source);
if (feature == null)
throw new ApplicationException(source + " not found");
return Encoding.UTF8.GetString(feature.Data);
}Una vez compilado el ejemplo, ejecute el proyecto de ofuscación Obfuscate.babel en Babel Desktop o desde la línea de comandos con babel --project Obfuscate.babel para proteger las funciones de la aplicación con el cifrado de código.
Las estadísticas de ofuscación indican los métodos cifrados para cada origen de función, como feature1. En Babel Desktop, las estadísticas de Cifrado de código enumeran cada método cifrado con su origen.
Puede iniciar la aplicación protegida y generar una licencia para las tres ediciones de la aplicación que se ofrecen: Standard, Professional y Enterprise. Cada edición desbloquea un número creciente de funciones, es decir, cuanto más alta sea la edición que licencie, más funciones podrá usar en la aplicación. Así, generar una licencia para la edición Enterprise desbloquea todas las funciones, mientras que generar una licencia para la edición Standard solo desbloquea una parte de ellas.

Funciones con licencia
La clase LicenseManager comprueba que haya una licencia válida y que estén presentes las funciones solicitadas. Si la licencia es válida y las funciones están habilitadas, la aplicación permite al usuario acceder a ellas.
En conjunto, usar el cifrado de código con Babel Licensing es una forma eficaz de crear aplicaciones flexibles y ricas en funciones sin dejar de proteger el código frente a la ingeniería inversa y la piratería.