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

¿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 una para las versiones de prueba.

Relacionado:

  • ¿Cómo puedo ofuscar mejor mi código de verificación de licencia de producto C #?
  • Activación de licencia basada en web
  • ¿Cómo se protege su software de la distribución ilegal?
  • ¿El mejor software de clave de activación para la aplicación .NET?

Puede hacer algo como crear un registro que contenga los datos que desea autenticar en la aplicación. Esto podría incluir todo lo que desee, por ejemplo, características del progtwig para habilitar, fecha de caducidad, nombre del usuario (si desea vincularlo a un usuario). Luego encripta eso usando algún algoritmo crypto con una clave fija o hash it. Entonces solo lo verificas dentro de tu progtwig. Una forma de distribuir el archivo de licencia (en Windows) es proporcionarlo como un archivo que actualiza el registro (ahorra al usuario tener que escribirlo).

Sin embargo, tenga cuidado con el falso sentido de seguridad: tarde o temprano alguien simplemente parcheará su progtwig para omitir ese control y distribuirá la versión parchada. O bien, resolverán una clave que aprueba todos los cheques y la distribuirán, o actualizarán el reloj, etc. No importa cuán intrincado hagas tu esquema, cualquier cosa que hagas para esto será, en última instancia, la seguridad en la oscuridad y siempre lo harán. ser capaz de esto Incluso si no pueden, alguien lo hará y distribuirán la versión pirateada. Lo mismo se aplica incluso si proporciona un dispositivo de seguridad; si alguien lo desea, también pueden aplicarle un parche al cheque. Firmar digitalmente su código no ayudará, pueden eliminar esa firma o renunciar a ella.

Puede complicar un poco las cosas usando técnicas para evitar que el progtwig se ejecute en un depurador, etc., pero incluso esto no es a prueba de balas. Entonces debería hacer que sea lo suficientemente difícil como para que un usuario honesto no se olvide de pagar. También tenga mucho cuidado de que su plan no se vuelva molesto para los usuarios que pagan; es mejor tener algunas copias arrancadas que para que sus clientes que pagan no puedan usar lo que han pagado.

Otra opción es tener un cheque en línea: simplemente proporcione al usuario una identificación única y verifique en línea qué capacidades debe tener ese ID, y almacénelo en caché durante un cierto tiempo. No obstante, se aplican las mismas advertencias: las personas pueden sortear algo como esto.

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 podrá ser, mientras las personas controlen el hardware y el sistema operativo en el que se ejecuta su progtwig. Los desarrolladores han estado tratando de idear esquemas cada vez más complejos para esto, pensando que si desarrollan su propio sistema para él, entonces será conocido solo por ellos y, por lo tanto, será “más seguro”. Pero realmente es el equivalente de progtwigción de intentar construir una máquina de movimiento perpetuo. 🙂

¿En quién confías?

Siempre consideré que esta área es demasiado crítica para confiar en un tercero que administre la seguridad de tiempo de ejecución de su aplicación. Una vez que ese componente se descifra para una aplicación, se descifra para todas las aplicaciones. Le sucedió a Discreet en cinco minutos una vez que eligieron una solución de licencia de terceros para 3ds Max hace años … ¡Lo pasamos bien!

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

  • Nombre de la licencia: el nombre del cliente (si corresponde) que está licenciando. Útil para administrar las implementaciones de la empresa: haga que se sientan especiales por tener un nombre “personalizado” en la información de la licencia que les proporciona.
  • Fecha de vencimiento de la licencia
  • Número de usuarios que se ejecutarán con la misma licencia. Esto supone que tiene una forma de rastrear instancias en ejecución a través de un sitio, en una forma de servidor.
  • Códigos de función: para permitirle usar el mismo sistema de licencia en múltiples funciones y en varios productos. Por supuesto, si está roto para un producto, está roto para todos.

Luego haga una sum de comprobación al máximo y agregue el cifrado (reversible) que desee 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 ahora probablemente el código más importante en su aplicación / compañía, además de / en lugar de ofuscarlo, considere poner las rutinas de descifrado en un archivo DLL nativo y simplemente P / invocarlo .

Varias compañías para las que he trabajado han adoptado enfoques generalizados para esto con gran éxito. O tal vez los productos no valían la pena crackear;)

Si está preguntando sobre las claves que puede escribir, como las claves de productos de Windows, entonces se basan en algunas comprobaciones. Si está hablando de las claves que tiene que copiar pegar, entonces 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 del producto consta de cuatro grupos de 5 dígitos, como abcde-fghij-kljmo-pqrst , y luego pasar a especificar relaciones internas como f + k + p igual abcde-fghij-kljmo-pqrst , lo que significa que los primeros dígitos del grupo 2, 3 y 4 deben sumr a a. Esto significa que 8xxxx-2xxxx-4xxxx-2xxxx es válido, 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 forma habría generadores para las claves de productos y la verificación de las claves del producto simplemente verificaría si coincide con todas las reglas.

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

Si es trivial o difícil de descifrar, no estoy seguro de que realmente marque una gran diferencia.

La probabilidad de que su aplicación se descifre es mucho más proporcional a su utilidad que a la solidez del manejo de la clave del producto.

Personalmente, creo que hay dos clases de usuarios. Los que pagan Aquellos que no lo hacen. Los que sí lo hacen probablemente lo harán incluso con la protección más trivial. Aquellos que no lo hagan esperarán por una grieta o buscarán en otra parte. De cualquier manera, no te conseguirá más dinero.

También existe la opción de Servicios de Licencias y Licencias de Software (SLP) de Microsoft . Después de leer sobre esto, realmente me gustaría poder usarlo.

Me gusta mucho la idea de bloquear partes de código basadas en la licencia. Cosas calientes y más seguras para .NET. ¡Lectura interesante incluso si no la usas!

Los Servicios de Licencias y Licencias de Software (SLP) de Microsoft® es un servicio de activación de software que permite a los proveedores de software independientes (ISV) adoptar términos flexibles de licencia para sus clientes. Los Servicios SLP de Microsoft emplean un método de protección único que ayuda a proteger su aplicación y la información de licencia, permitiéndole llegar al mercado más rápido al tiempo que aumenta el cumplimiento del cliente.

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

Debo admitir que haría algo bastante loco.

  1. Encuentre un cuello de botella de CPU y extráigalo en un archivo P / Invokeable DLL.
  2. Como acción de creación posterior, cifre parte del archivo DLL con una clave de cifrado XOR.
  3. Seleccione un esquema de clave pública / privada, incluya una clave pública en el archivo DLL
  4. Organice para que al descifrar la clave del producto y al XORing las dos mitades, se obtenga la clave de cifrado para la DLL.
  5. En el código DllMain de la DLL, deshabilite la protección (PAGE_EXECUTE_READWRITE) y descifre la clave.
  6. Haga un método LicenseCheck () que haga una verificación de la cordura de la clave de licencia y los parámetros, luego comprueba todo el archivo DLL, lanzando una infracción de licencia en cualquiera de ellos. Oh, y hacer alguna otra inicialización aquí.

Cuando encuentren y eliminen el LicenseCheck, qué diversión seguirá cuando el DLL comience a fallar en la segmentación .

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

Otra buena herramienta económica para las claves y activaciones del producto es un producto llamado InstallKey. Eche un vistazo a http://www.lomacons.com

El truco es tener un algoritmo que solo usted conozca (de modo que pueda decodificarse en el otro extremo).

Hay cosas simples como, “Elige un número primo y agrega un número mágico”

Opciones más intrincadas 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 la clave.

También valdría 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, el paquete OLicense: http://www.olicense.de/index.php?lang=en

Un método simple es usar un identificador único global (GUID). Los GUID generalmente se almacenan como valores de 128 bits y comúnmente se muestran 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}", "$0/")); // And use this to separate every four digits with a "/". 

Espero que ayude.

Usted puede verificar LicenseSpot . Proporciona:

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

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

Como mencionó 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 funciones donde licencia características específicas de su aplicación (en este caso, hay un conjunto de funciones “completo” y un conjunto de características “de prueba”).

Para empezar, podríamos crear 2 tipos de licencias (llamadas políticas en Keygen) y siempre que un usuario registre una cuenta, puede generar una licencia de “prueba” para que comiencen (la licencia “de prueba” implementa nuestra política de características de “prueba”) , que puede usar para realizar varias comprobaciones dentro de la aplicación, por ejemplo, puede usar Trial-Feature-A y Trial-Feature-B .

Y a partir de eso, cada vez que un usuario compra su aplicación (ya sea que esté utilizando PayPal, Stripe, etc.), puede generar una licencia que implemente la política de funciones “completa” y asociarla a la cuenta del usuario. Ahora dentro de su aplicación puede verificar si el usuario tiene una licencia “completa” 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, ¿ qué quiero decir con eso? He analizado esto en detalle en algunas otras respuestas , pero un resumen rápido de por qué creo que esta es una forma superior de autenticar e identificar a los usuarios:

  1. Las cuentas de usuario le permiten asociar múltiples licencias y múltiples máquinas a un solo usuario , lo que le permite conocer el comportamiento de sus clientes y solicitarles “compras en la aplicación”, es decir, comprar su versión “completa” (tipo de aplicaciones móviles).
  2. No deberíamos exigir a nuestros clientes que ingresen claves de licencia largas, que son tediosas de ingresar y difíciles de seguir, es decir, se pierden fácilmente. (¡Intenta buscar “clave de licencia perdida” en Twitter!)
  3. Los clientes están acostumbrados a usar un correo electrónico / contraseña ; Creo que debemos hacer lo que las personas están acostumbradas 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, eso está completamente bien (y Keygen también lo permite ). Solo estoy ofreciendo otra forma de manejar ese aspecto de la licencia y espero brindarles un buen UX a 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 las licencias “completas” caduquen después de un año y las licencias de “prueba” duren, por ejemplo, 2 semanas, requiriendo que sus usuarios adquieran un nuevo licencia después de la expiración

Pude profundizar más, asociar máquinas con usuarios y cosas por el estilo, pero pensé que trataría de mantener esta respuesta corta y centrarme simplemente en las funciones de licencia para sus usuarios.

Por favor, compruebe esta respuesta: https://stackoverflow.com/a/38598174/1275924

La idea es usar Cryptolens como 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 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();