Pregunta

¿Cómo puedo crear una clave de producto para mi aplicación C #?

Necesito crear una clave de producto (o licencia) que actualizo anualmente. Además, necesito crear uno para las versiones de prueba.

  

Relacionado:

     
¿Fue útil?

Solución

Puede hacer algo como crear un registro que contenga los datos que desea autenticar en la aplicación. Esto podría incluir cualquier cosa que desee, p. características del programa para habilitar, fecha de caducidad, nombre del usuario (si desea vincularlo a un usuario). Luego, encripte eso usando algún algoritmo criptográfico con una clave fija o diviértalo. Luego, simplemente verifícalo dentro de tu programa. Una forma de distribuir el archivo de licencia (en Windows) es proporcionarlo como un archivo que actualiza el registro (evita que el usuario tenga que escribirlo).

Tenga cuidado con la falsa sensación de seguridad, tarde o temprano alguien simplemente parcheará su programa para omitir esa verificación y distribuirá la versión parcheada. O, elaborarán una clave que pase todas las verificaciones y la distribuyan, o retrocedan el reloj, etc. No importa cuán intrincado haga su esquema, todo lo que haga para esto será seguridad a través de la oscuridad y siempre lo harán. ser capaz de esto Incluso si no pueden, alguien lo hará y distribuirá la versión pirateada. Lo mismo se aplica incluso si proporciona un dongle; si alguien lo desea, también pueden parchear el cheque para eso. Firmar digitalmente su código no ayudará, pueden eliminar esa firma o renunciarla.

Puede complicar un poco las cosas utilizando técnicas para evitar que el programa se ejecute en un depurador, etc., pero incluso esto no es a prueba de balas. Por lo tanto, debe dificultar lo suficiente que un usuario honesto no se olvide de pagar. También tenga mucho cuidado de que su esquema no sea molesto para los usuarios que pagan; es mejor tener algunas copias copiadas que para que sus clientes que pagan no puedan usar lo que han pagado.

Otra opción es tener una verificación en línea: simplemente proporcione al usuario una identificación única, y verifique en línea qué capacidades debe tener esa identificación, y almacénela en caché durante algún tiempo. Sin embargo, se aplican las mismas advertencias: las personas pueden sortear cualquier cosa como esta.

Considere también los costos de soporte de tener que tratar con usuarios que han olvidado su clave, etc.

editar: solo quiero agregar, no inviertas demasiado tiempo en esto o pienses que de alguna manera tu intrincado esquema será diferente e indescifrable. No será, y no puede ser, mientras las personas controlen el hardware y el sistema operativo en el que se ejecuta su programa. Los desarrolladores han estado tratando de idear esquemas cada vez más complejos para esto, pensando que si desarrollan su propio sistema, entonces será conocido solo por ellos y, por lo tanto, 'más seguro'. Pero realmente es el equivalente de programación de tratar de construir una máquina de movimiento perpetuo. :-)

Otros consejos

¿En quién confías?

Siempre he considerado esta área demasiado crítica para confiar en un tercero para administrar la seguridad del tiempo de ejecución de su aplicación. Una vez que ese componente está descifrado para una aplicación, está descifrado para todas las aplicaciones. Le sucedió a Discreet en cinco minutos una vez que utilizaron una solución de licencia de terceros para 3ds Max años atrás ... ¡Buenos tiempos!

En serio, considera rodar el tuyo para tener un control completo sobre tu algoritmo. Si lo hace, considere usar componentes en su clave a lo largo de las líneas de:

  • Nombre de licencia: el nombre del cliente (si lo hay) que está licenciando. Útil para gestionar las implementaciones de la empresa: haga que se sientan especiales para tener un "personalizado" nombre en la información de licencia que les proporcione.
  • Fecha de vencimiento de la licencia
  • Número de usuarios para ejecutar con la misma licencia. Esto supone que tiene una forma de rastrear las instancias en ejecución en un sitio, en forma de servidor
  • Códigos de funciones: para permitirle utilizar el mismo sistema de licencias en múltiples funciones y en múltiples productos. Por supuesto, si está agrietado para un producto, está agrietado para todos.

Luego, suma la suma de comprobación y agrega el cifrado (reversible) que quieras para que sea más difícil de descifrar.

Para crear una clave de licencia de prueba, simplemente establezca valores para los valores anteriores que se traducen como "modo de prueba".

Y dado que este es probablemente el código más importante en su aplicación / empresa, además de / en lugar de ofuscación, considere colocar las rutinas de descifrado en un archivo DLL nativo y simplemente P / Invocar a ella.

Varias empresas para las que he trabajado han adoptado enfoques generalizados para esto con gran éxito. O tal vez no valía la pena descifrar los productos;)

Si pregunta sobre las claves que puede escribir, como las claves de producto de Windows, se basan en algunas comprobaciones. Si habla de las claves que debe copiar y pegar, se basan en una firma digital (cifrado de clave privada).

Una lógica de clave de producto simple podría ser comenzar diciendo que la clave de producto consta de cuatro grupos de 5 dígitos, como abcde-fghij-kljmo-pqrst , y luego especificar relaciones internas como f + k + p debe ser igual a a, lo que significa que los primeros dígitos del grupo 2, 3 y 4 deben sumar un total de a. Esto significa que 8xxxx-2xxxx-4xxxx-2xxxx es válido, al igual que 8xxxx-1xxxx-0xxxx-7xxxx. Por supuesto, también habría otras relaciones, incluidas relaciones complejas como, si el segundo dígito del primer grupo es impar, entonces el último dígito del último grupo también debería ser impar. De esta manera, habría generadores para las claves de producto y la verificación de las claves de producto simplemente comprobaría si coincide con todas las reglas.

El cifrado es normalmente la cadena de información sobre la licencia cifrada con una clave privada (== firmada digitalmente) y convertida a Base64 . La clave pública se distribuye con la aplicación. Cuando llega la cadena Base64, es verificada (== descifrada) por la clave pública y si se encuentra válida, el producto se activa.

Ya sea trivial o difícil de descifrar, no estoy seguro de que realmente haga mucha diferencia.

La probabilidad de que su aplicación sea descifrada es mucho más proporcional a su utilidad que a la fortaleza del manejo de la clave del producto.

Personalmente, creo que hay dos clases de usuarios. Los que pagan. Los que no. Los que lo hagan probablemente lo harán incluso con la protección más trivial. Aquellos que no lo hagan esperarán un crack o buscarán en otro lado. De cualquier manera, no obtendrá más dinero.

Tengo que admitir que haría algo bastante loco.

  1. Encuentre un cuello de botella de CPU y extráigalo a un P / Invokeable archivo DLL.
  2. Como acción posterior a la compilación, cifre parte del archivo DLL con un XOR clave de cifrado.
  3. Seleccione un esquema de clave pública / privada, incluya clave pública en el archivo DLL
  4. Organice de modo que descifre la clave del producto y haga XOR a los dos mitades juntas da como resultado la clave de cifrado para la DLL.
  5. En el código DllMain de la DLL, desactive la protección (PAGE_EXECUTE_READWRITE) y descifrarlo con la clave.
  6. Realice un método LicenseCheck () que realice una comprobación de sanidad del clave de licencia y parámetros, luego suma el archivo DLL completo, arrojando violación de licencia en cualquiera de los dos. Ah, y hacer alguna otra inicialización aquí.

Cuando encuentren y eliminen LicenseCheck, qué diversión seguirá cuando se inicia la DLL falla de segmentación .

Existe la opción Servicios de licencias y protección de software de Microsoft (SLP) también. Después de leerlo, realmente desearía poder usarlo.

Me gusta mucho la idea de bloquear partes del código en función de la licencia. Lo mejor, y lo más seguro para .NET. ¡Lectura interesante incluso si no la usa!

  

Microsoft & # 174; Licencias de software y   Servicios de Protección (SLP) es un   servicio de activación de software que   permite a los proveedores de software independientes   (ISV) para adoptar licencias flexibles   términos para sus clientes. Microsoft   SLP Services emplea un exclusivo   método de protección que ayuda a salvaguardar   su solicitud y licencia   información que le permite llegar a   mercado más rápido mientras aumenta   cumplimiento del cliente.

Nota: Esta es la única forma en que lanzaría un producto con código sensible (como un algoritmo valioso).

Si desea una solución simple para crear y verificar números de serie, intente Ellipter . Utiliza criptografía de curvas elípticas y tiene una "Fecha de caducidad" función para que pueda crear versiones de prueba o claves de registro de tiempo limitado.

Otra buena herramienta económica para claves de producto y activaciones es un producto llamado InstallKey. Eche un vistazo a www.lomacons.com

Un método simple es utilizar un Identificador único global (GUID). Los GUID generalmente se almacenan como valores de 128 bits y se muestran comúnmente como 32 dígitos hexadecimales con grupos separados por guiones, como {21EC2020-3AEA-4069-A2DD-08002B30309D} .

Use el siguiente código en C # por System.Guid.NewGuid () .

getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.

_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "<*>/")); // And use this to separate every four digits with a "/".

Espero que ayude.

El truco es tener un algoritmo que solo tú conozcas (de modo que pueda decodificarse en el otro extremo).

Hay cosas simples como, "Elige un número primo y agrégale un número mágico"

Opciones más complicadas, como el uso de cifrado asimétrico de un conjunto de datos binarios (que podría incluir un identificador único, números de versión, etc.) y distribuir los datos cifrados como clave.

También podría valer la pena leer las respuestas a esta pregunta también

Hay algunas herramientas y API disponibles para ello. Sin embargo, no creo que encuentres uno gratis;)

Existe, por ejemplo, la suite OLicense: http://www.olicense.de/index.php?lang=en

Puede consultar LicenseSpot . Proporciona:

  • Componente de licencia gratuita
  • Activación en línea
  • API para integrar su aplicación y tienda en línea
  • Generación de número de serie
  • Revocar licencias
  • Gestión de suscripciones

Voy a aprovechar un poco la gran respuesta de @ frankodwyer y profundizaré un poco más en las licencias basadas en línea. Soy el fundador de Keygen , una API REST de licencias creada para desarrolladores.

Ya que mencionaste querer 2 " tipos " de licencias para su aplicación, es decir, una "versión completa" y una '' versión de prueba '', podemos simplificar eso y usar un modelo de licencia de función donde usted licencia las funciones específicas de su aplicación (en este caso, hay un conjunto de funciones "completo" y un " ; prueba " conjunto de características).

Para comenzar, podríamos crear 2 tipos de licencia (llamados políticas en Keygen) y cada vez que un usuario registre una cuenta, puede generar una "prueba". licencia para que comiencen (la `` licencia de prueba '' implementa nuestra `` política de características de prueba ''), que puede usar para hacer varias comprobaciones dentro de la aplicación, p. el usuario puede usar Trial-Feature-A y Trial-Feature-B .

Y basándose en eso, cada vez que un usuario compre su aplicación (ya sea que esté usando PayPal, Stripe, etc.), puede generar una licencia implementando el " completo " política de función y asóciela con la cuenta del usuario. Ahora, dentro de su aplicación, puede verificar si el usuario tiene un " completo " licencia que puede hacer Pro-Feature-X y Pro-Feature-Y (haciendo algo como user.HasLicenseFor (FEATURE_POLICY_ID) ).

Mencioné permitir a sus usuarios crear cuentas de usuario & # 8212; ¿qué quiero decir con eso? He entrado en esto en detalle en a un par de otras respuestas , pero un resumen rápido de por qué creo que esta es una forma superior de autenticar e identificar a sus usuarios:

    Las
  1. cuentas de usuario le permiten asociar múltiples licencias y múltiples máquinas a un usuario único , lo que le permite conocer el comportamiento de su cliente y para solicitarles " compras en la aplicación " es decir, comprar su " completa " versión (algo así como aplicaciones móviles).
  2. No deberíamos exigir a nuestros clientes que ingresen claves de licencia largas, que son tediosas para ingresar y difíciles de rastrear , es decir, se pierden fácilmente. (¡Intente buscar " clave de licencia perdida " en Twitter!)
  3. Los clientes están acostumbrados a usar un correo electrónico / contraseña ; Creo que deberíamos hacer lo que la gente está acostumbrada a hacer para que podamos proporcionar una buena experiencia de usuario (UX).

Por supuesto, si no quiere manejar cuentas de usuario y quiere que sus usuarios ingresen claves de licencia, está completamente bien (y Keygen también admite hacerlo ). Solo estoy ofreciendo otra forma de manejar ese aspecto de la licencia y espero proporcionar una buena experiencia de usuario para sus clientes.

Finalmente, dado que también mencionó que desea actualizar estas licencias anualmente, puede establecer una duración en sus políticas para que " completo " las licencias caducarán después de un año y "prueba" las licencias duran aproximadamente 2 semanas, lo que requiere que sus usuarios compren una nueva licencia después de su vencimiento.

Podría profundizar más, asociando máquinas con usuarios y cosas así, pero pensé que trataría de mantener esta respuesta breve y enfocarme simplemente en otorgar licencias de funciones a sus usuarios.

Verifique esta respuesta: https://stackoverflow.com/a/38598174/1275924

La idea es utilizar Cryptolens como el servidor de licencias. Aquí hay un ejemplo paso a paso (en C # y VB.NET). También adjunté un fragmento de código para la verificación de la clave a continuación (en C #):

var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";

var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
    Key = licenseKey,
    ProductId = 3349,
    Sign = true,
    MachineCode = Helpers.GetMachineCode()
});

if (result == null || result.Result == ResultType.Error ||
    !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
    // an error occurred or the key is invalid or it cannot be activated
    // (eg. the limit of activated devices was achieved)
    Console.WriteLine("The license does not work.");
}
else
{
    // everything went fine if we are here!
    Console.WriteLine("The license is valid!");
}

Console.ReadLine();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top