Actualmente estoy involucrado en el desarrollo de un producto (desarrollado en C #) que estará disponible para descargar e instalar de forma gratuita pero en una versión muy limitada. Para obtener acceso a todas las funciones, el usuario debe pagar una tarifa de licencia y recibir una clave. Esa clave se ingresará en la aplicación para "desbloquear" la versión completa.
Como usar una clave de licencia como esa es algo habitual, me pregunto:
- ¿Cómo se resuelve eso generalmente?
- ¿Cómo puedo generar la clave y cómo la aplicación puede validarla?
- ¿Cómo puedo evitar que una clave se publique en Internet y sea utilizada por otros que no hayan pagado la licencia (una clave que básicamente no es "suya")?
Supongo que también debería vincular la clave a la versión de la aplicación de alguna manera para que sea posible cobrar por las nuevas claves en las versiones de funciones.
¿Algo más en lo que deba pensar en este escenario?
fuente
Hay muchas formas de generar claves de licencia, pero muy pocas de ellas son realmente seguras. Y es una pena, porque para las empresas, las claves de licencia tienen casi el mismo valor que el efectivo real.
Lo ideal sería que sus claves de licencia tengan las siguientes propiedades:
Solo su empresa debería poder generar claves de licencia para sus productos, incluso si alguien realiza una ingeniería inversa de sus productos (lo que sucederá, hablo por experiencia). Ofuscar el algoritmo u ocultar una clave de cifrado dentro de su software está realmente fuera de discusión si se toma en serio el control de las licencias. Si su producto tiene éxito, alguien creará un generador de claves en cuestión de días desde su lanzamiento.
Una clave de licencia debería ser utilizable en una sola computadora (o al menos debería poder controlarla muy estrictamente)
Una clave de licencia debe ser breve y fácil de escribir o dictar por teléfono. No desea que todos los clientes llamen al soporte técnico porque no entienden si la clave contiene una "l" o un "1". Su departamento de soporte lo agradecería y tendrá costos más bajos en esta área.
Entonces, ¿cómo resuelves estos desafíos?
La respuesta es simple pero técnicamente desafiante: firmas digitales usando criptografía de clave pública. De hecho, sus claves de licencia deben ser "documentos" firmados, que contengan algunos datos útiles, firmados con la clave privada de su empresa. Las firmas deben ser parte de la clave de licencia. El producto debe validar las claves de licencia con la clave pública correspondiente. De esta manera, incluso si alguien tiene acceso completo a la lógica de su producto, no puede generar claves de licencia porque no tiene la clave privada. Una clave de licencia se vería así: BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) El mayor desafío aquí es que los algoritmos clásicos de clave pública tienen grandes tamaños de firma. RSA512 tiene una firma de 1024 bits. No desea que sus claves de licencia tengan cientos de caracteres. Uno de los enfoques más potentes es utilizar la criptografía de curva elíptica (con implementaciones cuidadosas para evitar las patentes existentes). Las claves ECC son como 6 veces más cortas que las claves RSA, para la misma potencia. Puede reducir aún más los tamaños de firma utilizando algoritmos como el algoritmo de firma digital Schnorr (la patente expiró en 2008 - buena :))
Esto se puede lograr mediante la activación del producto (Windows es un buen ejemplo). Básicamente, para un cliente con una clave de licencia válida, debe generar algunos "datos de activación", que es un mensaje firmado que incorpora la identificación del hardware de la computadora como los datos firmados. Esto generalmente se hace a través de Internet, pero solo UNA VEZ: el producto envía la clave de licencia y la identificación del hardware de la computadora a un servidor de activación, y el servidor de activación devuelve el mensaje firmado (que también se puede hacer corto y fácil de dictar sobre el teléfono). A partir de ese momento, el producto no verifica la clave de licencia al inicio, sino los datos de activación, que necesitan que la computadora sea la misma para validar (de lo contrario, los DATOS serían diferentes y la firma digital no se validaría).
Bueno, simplemente elimine los caracteres redundantes como "1", "l", "0", "o" de sus teclas. Divida la cadena de clave de licencia en grupos de caracteres.
fuente
Respuesta simple: no importa qué esquema utilices, se puede descifrar.
No castigue a los clientes honestos con un sistema destinado a prevenir a los piratas informáticos, ya que los piratas informáticos lo romperán independientemente
Un código hash simple vinculado a su correo electrónico o similar es probablemente lo suficientemente bueno. Las ID basadas en hardware siempre se convierten en un problema cuando las personas necesitan reinstalar o actualizar el hardware.
Buen hilo sobre el tema: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34
fuente
Al generar la clave, no olvides concatenar la versión y el número de compilación a la cadena en la que calculas el hash. De esa manera, no habrá una sola clave que desbloquee todo lo que haya lanzado.
Después de encontrar algunas claves o parches flotando en astalavista.box.sk , sabrá que logró hacer algo lo suficientemente popular que alguien se molestó en descifrar. ¡Alegrarse!
fuente
Además de lo que ya se ha dicho ...
Cualquier uso de aplicaciones .NET es inherentemente rompible debido a los problemas de lenguaje intermedio. Un simple desmontaje del código .NET abrirá su producto a cualquiera. Pueden pasar por alto fácilmente su código de licencia en ese momento.
Ya ni siquiera puede usar valores de hardware para crear una clave. Las máquinas virtuales ahora permiten a alguien crear una imagen de una máquina con licencia y ejecutarla en cualquier plataforma que elijan.
Si es un software costoso, hay otras soluciones. Si no es así, solo hazlo lo suficientemente difícil para el hacker casual. Y acepte el hecho de que eventualmente habrá copias sin licencia.
Si su producto es complicado, los problemas de soporte inherentes serán crear cierta protección para usted.
fuente
El motor C # / .NET que utilizamos para la generación de claves de licencia ahora se mantiene como código abierto:
https://github.com/appsoftware/.NET-Licence-Key-Generator .
Se basa en un sistema de "Verificación de clave parcial", lo que significa que solo un subconjunto de la clave que utiliza para generar la clave debe compilarse en su distribuible. Usted crea las claves usted mismo, por lo que la implementación de la licencia es exclusiva de su software.
Como se indicó anteriormente, si su código se puede descompilar, es relativamente fácil eludir la mayoría de los sistemas de licencias.
fuente
Soy uno de los desarrolladores detrás de la plataforma de licencias de software Cryptolens y he estado trabajando en sistemas de licencias desde los 14 años. En esta respuesta, he incluido algunos consejos basados en la experiencia adquirida a lo largo de los años.
La mejor manera de resolver esto es configurando un servidor de clave de licencia que cada instancia de la aplicación llamará para verificar una clave de licencia.
Beneficios de un servidor de clave de licencia
Las ventajas con un servidor de clave de licencia es que:
Consideraciones
Si bien la verificación de licencias en línea le brinda más control sobre cada instancia de la aplicación, la conexión a Internet no siempre está presente (especialmente si se dirige a empresas más grandes), por lo que necesitamos otra forma de realizar la verificación de la clave de licencia.
La solución es firmar siempre la respuesta de la clave de licencia del servidor utilizando un criptosistema de clave pública como RSA o ECC (posiblemente mejor si planea ejecutar en sistemas integrados). Su aplicación solo debe tener la clave pública para verificar la respuesta de la clave de licencia.
Entonces, en caso de que no haya conexión a Internet, puede usar la respuesta de clave de licencia anterior en su lugar. Asegúrese de almacenar tanto la fecha como el identificador de la máquina en la respuesta y verifique que no sea demasiado antigua (por ejemplo, permita que los usuarios estén desconectados como máximo 30 días, etc.) y que la respuesta de la clave de licencia pertenezca al dispositivo correcto.
Proteger algoritmos secretos
La mayoría de las aplicaciones .NET se pueden realizar con ingeniería inversa con bastante facilidad (hay un desensamblador proporcionado por Microsoft para obtener el código IL y algunos productos comerciales pueden incluso recuperar el código fuente en, por ejemplo, C #). Por supuesto, siempre puedes ofuscar el código, pero nunca es 100% seguro.
En la mayoría de los casos, el propósito de cualquier solución de licencia de software es ayudar a las personas honestas a ser honestas (es decir, que los usuarios honestos que estén dispuestos a pagar no se olviden de pagar después de que caduque una prueba, etc.).
Sin embargo, es posible que aún tenga algún código que de ninguna manera quiera filtrar al público (por ejemplo, un algoritmo para predecir los precios de las acciones, etc.). En este caso, la única forma de hacerlo es crear un punto final de API al que llamará su aplicación cada vez que se ejecute el método. Requiere conexión a Internet, pero asegura que su código secreto nunca sea ejecutado por la máquina del cliente.
Implementación
Si no desea implementar todo usted mismo, le recomendaría que eche un vistazo a este tutorial (parte de Cryptolens )
fuente
He usado Crypkey en el pasado. Es uno de los muchos disponibles.
Solo puede proteger el software hasta cierto punto con cualquier esquema de licencia.
fuente
No sé qué tan elaborado quieres ser
pero creo que .net puede acceder al número de serie del disco duro.
puede hacer que el programa le envíe eso y algo así (como el nombre de usuario y la dirección mac del nic)
calcula un código basado en eso y les envía la clave por correo electrónico.
evitarán que cambien las máquinas una vez que tengan la llave.
fuente
La única forma de hacer todo lo que solicitó es exigir un acceso a Internet y verificación con un servidor. La aplicación debe iniciar sesión en el servidor con la clave y luego debe almacenar los detalles de la sesión, como la dirección IP. Esto evitará que la clave se use en varias máquinas diferentes. Esto generalmente no es muy popular entre los usuarios de la aplicación, y a menos que sea una aplicación muy costosa y complicada, no vale la pena.
Simplemente podría tener una clave de licencia para la aplicación, y luego verificar el lado del cliente si la clave es buena, pero es fácil distribuir esta clave a otros usuarios, y con un descompilador se pueden generar nuevas claves.
fuente
Implementé la activación única basada en Internet en el software de mi empresa (C # .net) que requiere una clave de licencia que se refiere a una licencia almacenada en la base de datos del servidor. El software llega al servidor con la clave y recibe información de licencia que luego se cifra localmente utilizando una clave RSA generada a partir de algunas variables (una combinación de CPUID y otras cosas que no cambiarán con frecuencia) en la computadora del cliente y luego la almacena en el registro
Requiere un poco de codificación del lado del servidor, pero nos ha funcionado muy bien y pude usar el mismo sistema cuando nos expandimos al software basado en navegador. También le brinda a su personal de ventas una gran información sobre quién, dónde y cuándo se está utilizando el software. Cualquier sistema de licencias que solo se maneja localmente es completamente vulnerable a la explotación, especialmente con la reflexión en .NET . Pero, como todos han dicho, ningún sistema es completamente seguro.
En mi opinión, si no está utilizando licencias basadas en la web, no tiene ningún sentido proteger el software. Con el dolor de cabeza que puede causar DRM, no es justo para los usuarios que realmente han pagado que sufran.
fuente
Creo firmemente que solo el sistema de licencia basado en criptografía de clave pública es el enfoque correcto aquí, porque no tiene que incluir información esencial requerida para la generación de licencias en su código fuente.
En el pasado, he usado la Biblioteca de licencias de Treek muchas veces, porque cumple todos estos requisitos y ofrece un precio realmente bueno. Utiliza la misma protección de licencia para los usuarios finales y para sí mismo, y nadie lo descifró hasta ahora. También puede encontrar buenos consejos en el sitio web para evitar la piratería y las grietas.
fuente
Como algunos otros mencionados, soy un gran oponente de ser hostil a los clientes por defecto, algo por lo que la industria de licencias es conocida. Así que ampliaré una buena solución para su problema que también ofrece un buen cliente UX .
Para comenzar, mencionó que tiene una versión "limitada" de su software que está utilizando para tratar de convertir a los clientes a "actualizar" para obtener funciones adicionales. Así que lo que está buscando son las licencias de funciones de su producto, por ejemplo, un cliente puede comprar una licencia para funciones X o función-Y .
Construí Keygen con este tipo de licencia en mente. Keygen es una API REST de licencias que le permite administrar cuentas de usuario, licencias y también rastrear el uso / asociaciones de la máquina.
Lo que haría es configurar 2 tipos de licencia (una política dentro de Keygen) donde una es una política básica para la versión gratuita limitada y la otra es una política para la versión paga.
No estoy seguro de lo que está usando para los pagos, pero supongamos que está usando algo como Stripe (bastante estándar hoy en día) que ofrece webhooks . Keygen también tiene webhooks (ya sea que lo use o no, todo esto sigue siendo aplicable). Puede integrar Keygen para hablar con su proveedor de pagos utilizando webhooks de ambos lados (piense:
customer.created
-> crear una licencia base para el cliente,license.created
-> cobrar al cliente por la nueva licencia).Entonces, al utilizar webhooks, podemos automatizar la creación de licencias para nuevos clientes. Entonces, ¿qué pasa con la validación de la licencia dentro de la propia aplicación? Esto se puede hacer de varias maneras, pero la forma más popular es exigir a su cliente que ingrese una clave de licencia larga en un campo de entrada que luego puede validar; Creo que esta es una forma terrible de manejar la validación de la licencia en su aplicación.
¿Por qué pienso eso? En primer lugar, requiere que su cliente ingrese una clave de licencia tediosamente larga destinada al consumo de la máquina, y en segundo lugar, requiere que usted y su cliente realicen un seguimiento de dicha clave de licencia tediosamente larga .
Bien, entonces, ¿qué es una alternativa? Creo que la mejor alternativa es hacer algo a lo que estén acostumbrados todos sus clientes: permitirles crear una cuenta para su producto utilizando un correo electrónico / contraseña . Luego puede asociar todas sus licencias y sus máquinas con esa cuenta. Entonces, en lugar de ingresar una clave de licencia, simplemente pueden iniciar sesión con sus credenciales.
¿Qué ventaja te da eso? En primer lugar, elimina la necesidad de que usted y sus clientes realicen un seguimiento de las claves de licencia, ya que todo se maneja detrás de escena dentro de su cuenta de usuario y lo más importante: ahora puede ofrecer a sus clientes licencias y máquinas de autoservicio ¡activación! es decir, dado que todas sus licencias y máquinas están asociadas con su cuenta de usuario, puede solicitarles que compren una licencia cuando inicien su aplicación en una máquina no reconocida.
Ahora sobre validación de la licencia : cada vez que el cliente inicia sesión en la aplicación con su correo electrónico / contraseña, puede preguntar su cuenta de usuario para las licencias de su propiedad para determinar si pueden utilizar funciones X o función-Y . ¡Y dado que su aplicación ahora es de autoservicio , puede permitir que sus clientes compren funciones adicionales directamente desde su aplicación!
Por lo tanto, hemos introducido un montón de automatización en nuestro sistema de licencias, podemos otorgar licencias de funciones individuales (es decir, una versión limitada frente a la completa), hemos ofrecido una experiencia de usuario increíble para nuestros clientes y también hemos aliviado una de las principales razones para solicitudes de soporte: recuperación de clave de licencia.
De todos modos, esto se hizo largo, pero espero que ayude a alguien.
fuente
No es posible prevenir la piratería de software por completo. Puede evitar la piratería casual y eso es lo que hacen todas las soluciones de licencia.
La licencia bloqueada de nodo (máquina) es mejor si desea evitar la reutilización de las claves de licencia. He estado usando Cryptlex durante aproximadamente un año para mi software. También tiene un plan gratuito , por lo que si no espera demasiados clientes, puede usarlo de forma gratuita.
fuente
Puede usar una solución de terceros gratuita para manejar esto por usted, como Quantum-Key.Net. Es gratis y maneja los pagos a través de PayPal a través de una página de ventas web que crea para usted, emite claves por correo electrónico y bloquea el uso de claves en una computadora específica para Prevenir la piratería.
También debe tener cuidado de ofuscar / cifrar su código o se puede realizar ingeniería inversa fácilmente utilizando software como De4dot y .NetReflector. Un buen ofuscador de código gratuito es ConfuserEx, que es rápido y fácil de usar y más efectivo que las alternativas costosas.
Debe ejecutar su software terminado a través de De4Dot y .NetReflector para realizar ingeniería inversa y ver qué vería un cracker si hicieran lo mismo y para asegurarse de que no haya dejado ningún código importante expuesto o sin disfraz.
Su software seguirá siendo crackeable, pero para el cracker informal puede ser suficiente para posponerlos y estos simples pasos también evitarán que su código sea extraído y reutilizado.
https://quantum-key.net
¿Cómo usar ConfuserEx?
https://github.com/0xd4d/de4dot
https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download
fuente