Pregunta

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.Luego, 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:

  1. ¿Cómo se suele solucionar eso?
  2. ¿Cómo puedo generar la clave y cómo puede ser validada por la aplicación?
  3. ¿Cómo puedo evitar también que una clave se publique en Internet y sea utilizada por otras personas que no han pagado la licencia (una clave que básicamente no es "de ellos)?

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 nuevas claves en las versiones destacadas.

¿Algo más en lo que debería pensar en este escenario?

¿Fue útil?

Solución

Advertencia: no se puede evitar que los usuarios de la piratería, pero sólo que sea más fácil para los usuarios honestos para hacer lo correcto

.

Suponiendo que usted no quiere hacer una versión especial para cada usuario, a continuación:

  • Generar mismo una clave secreta para el producto
  • Tome el nombre del usuario
  • Concatentate el nombre de usuario y la clave secreta y hash con (por ejemplo) SHA1
  • Descomprimir el hash SHA1 como una cadena alfanumérica. Esto es "clave de producto" del usuario individual
  • Dentro del programa, haga lo mismo hash, y comparar con la clave del producto. Si es igual, en Aceptar.

Pero, repito: esto no evitará la piratería


He leído recientemente que este enfoque no es muy criptográficamente sonido. Sin embargo, esta solución ya es débil ( como el software en sí tiene que incluir la clave secreta en algún lugar ), por lo que no creo que este descubrimiento invalida la solución en la medida de lo que va.

Solo pensé que realmente debería hablar de esto, sin embargo; si usted está planeando para obtener algo más de esto, ten cuidado.

Otros consejos

Hay muchas maneras de generar claves de licencia, pero muy pocas de esas formas son verdaderamente seguro. Y es una lástima, ya que para las empresas, las claves de licencia tienen casi el mismo valor que el dinero real.

Lo ideal es que quiere que sus claves de licencia que tienen las siguientes propiedades:

  1. Sólo su empresa debe ser capaz de generar claves de licencia para sus productos, incluso si alguien ingenieros completamente inversas sus productos (lo que sucederá, hablo por experiencia). Ofuscar el algoritmo u ocultar una clave de cifrado dentro de su software es realmente fuera de la cuestión, si usted es serio sobre el control de la concesión de licencias. Si el producto tiene éxito, alguien va a hacer un generador de claves en cuestión de días a partir de la liberación.

  2. Una clave de licencia debe ser utilizable en una sola computadora (o al menos debería ser capaz de controlar esta muy bien)

  3. Una clave de licencia debe ser corto y fácil de escribir o dictar por teléfono. No desea que todos los clientes llamar a la asistencia técnica ya que no entienden si la clave contiene una "L" o un "1". Su departamento de apoyo que sería gracias por esto, y usted tendrá menores costos en esta área.

Entonces, ¿cómo resolver estos desafíos?

  1. La respuesta es sencilla pero técnicamente difícil: las firmas digitales que utilizan la criptografía de clave pública. Las claves de licencia deben ser, de hecho, firmado "documentos", que contiene algunos datos útiles, firmado con la clave privada de la 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 pueden generar las claves de licencia, ya que no tienen 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 de clave pública clásicos tienen grandes tamaños de firma. RSA512 tiene una firma de 1024 bits. Usted no quiere que sus claves de licencia que tienen cientos de caracteres. Uno de los enfoques más potentes es el uso de la criptografía de curva elíptica (con implementaciones cuidadosos para evitar las patentes existentes). claves ECC son como 6 veces más corta que las claves RSA, por la misma fuerza. Puede reducir aún más el tamaño de la firma utilizando algoritmos como el algoritmo de firma digital Schnorr (patente expiró en 2008 - buena :))

  2. Esto se puede lograr por la activación del producto (Windows es un buen ejemplo). Básicamente, para un cliente con una clave de licencia válida, es necesario generar un poco de "datos de activación", que es un mensaje firmado la incorporación de Identificación del hardware del equipo como los datos firmados. Esto normalmente se hace en internet, pero sólo una vez: el producto envía la clave de licencia y el identificador de hardware del ordenador a un servidor de activación, y el servidor de activación responde con un mensaje firmado (que también se puede hacer corto y fácil de dictar el teléfono). A partir de ese momento, el producto no comprueba la clave de licencia en el inicio, pero los datos de activación, que necesita el equipo sea el mismo con el fin de validar (de lo contrario, los datos serían diferentes y la firma digital no validaría). Tenga en cuenta que la comprobación de los datos de activación no requieren la verificación a través de Internet:. Es suficiente para verificar la firma digital de los datos de activación con la clave pública que ya esté incrustado en el producto

  3. Bueno, sólo eliminar caracteres redundantes como "1", "L", "0", "o" de las llaves. Dividir la cadena de clave de licencia en grupos de caracteres.

Respuesta simple: no importa qué esquema uses, 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 descifrarán de todos modos.

Un código hash simple vinculado a su correo electrónico o similar probablemente sea suficiente.Las identificaciones 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

Al generar la clave, no se olvide de concatenar la versión y el número de compilación de la cadena se calcula el hash sucesivamente. De esta manera no habrá una única llave que abre todas todo lo que se han publicado.

Después de encontrar algunas claves o parches que flotan en astalavista.box.sk sabrá que usted ha logrado hacer algo bastante popular que alguien molestaba a agrietarse. Alégrate!

Además de lo que ya se ha dicho ....

Cualquier uso de aplicaciones .NET son inherentemente frágil debido a los problemas de lenguaje intermedio. Un simple desmontaje del código .NET abrirá su producto a cualquier persona. Ellos pueden pasar por alto fácilmente su código de licencia en ese punto.

No se puede incluso utilizar los valores de hardware para crear una clave más. Las máquinas virtuales permiten ahora a alguien para crear una imagen de una máquina 'licencia' y ejecutarlo en cualquier plataforma que elijan.

Si se trata de un software caro que hay otras soluciones. Si no lo es, sólo lo hacen bastante difícil para el hacker ocasional. Y aceptar el hecho de que no habrá copias sin licencia por ahí con el tiempo.

Si su producto es complicada, los problemas inherentes de apoyo serán crear algún tipo de protección para usted.

El motor # / .NET C se utiliza para la generación de clave de licencia ahora se mantiene como código abierto:

https://github.com/appsoftware/.NET-Licence-Key- generador.

Se basa en un sistema de "Comprobación de las claves parcial", que significa sólo un subconjunto de la clave que se utiliza para generar la clave tiene que ser compilado en su distribución. Se crea las claves de su auto, por lo que la aplicación de licencia es única a su software.

Como se mencionó anteriormente, si su código puede ser decompiled, es relativamente fácil de eludir la mayoría de los sistemas de licencias.

He usado Crypkey en el pasado. Es uno de los muchos disponibles.

Sólo se puede proteger el software hasta cierto punto con cualquier sistema de licencias.

No sé cómo elaborar desea obtener

Pero yo creo que .NET pueden acceder al número de serie del disco duro.

que podría tener el programa que envíe y algo que eles (como el nombre de usuario y la dirección MAC de la NIC)

a calcular un código basado fuera de eso y enviarlas por correo electrónico de vuelta la llave.

van a evitar que las máquinas de cambiar después de que tengan la clave.

Soy uno de los desarrolladores detrás del Criptolentes plataforma de licencias de software 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 claves de licencia al que llamará cada instancia de la aplicación para verificar una clave de licencia.

Beneficios de un servidor de claves de licencia

Las ventajas de un servidor de claves de licencia son las siguientes:

  1. siempre puede actualizar o bloquear una clave de licencia con efecto inmediato.
  2. cada clave de licencia se puede bloquear para una cierta cantidad de máquinas (esto ayuda a evitar que los usuarios publiquen la clave de licencia en línea para que otros la usen).

Consideraciones

Aunque 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 sólo debe tener la Llave 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.Asegúrese de guardar tanto el fecha y el identificador de máquina en la respuesta y comprobar que no sea demasiado antiguo (ej.permite que los usuarios estén desconectados durante un máximo de 30 días, etc.) y que la respuesta de la clave de licencia pertenezca al dispositivo correcto.

Nota siempre debe verificar el certificado de respuesta de la clave de licencia, incluso si está conectado a Internet), para asegurarse de que no haya cambiado desde que salió del servidor (esto aún debe hacerse incluso si su API para la licencia el servidor de claves utiliza https)

Protegiendo algoritmos secretos

La mayoría de las aplicaciones .NET se pueden aplicar 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, 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 olviden pagar después de que expire la prueba, etc.).

Sin embargo, es posible que todavía tengas algún código que de ninguna manera quieras filtrar al público (p. ej.un algoritmo para predecir los precios de las acciones, etc.).En este caso, la única manera de hacerlo es crear una Punto final API que su aplicación llamará cada vez que se deba ejecutar el método.Requiere conexión a Internet, pero garantiza que la máquina cliente nunca ejecute su código secreto.

Implementación

Si no desea implementar todo usted mismo, le recomendaría que eche un vistazo a este tutorial (parte de Criptolentes)

La única manera de hacer todo lo que solicitó es para requerir un acceso a Internet y la verificación con un servidor. La aplicación tiene que iniciar sesión en el servidor con la llave, y entonces usted necesita para almacenar los detalles de la sesión, como la dirección IP. Esto evitará que la clave sea utilizada en varias máquinas diferentes. Esto no suele ser muy popular entre los usuarios de la aplicación, ya no ser que se trata de una aplicación muy caro y complicado que no vale la pena.

Se podía tiene una clave de licencia de la aplicación, y luego comprueba el lado del cliente si la clave es buena, pero es fácil de distribuir esta clave a otros usuarios, y con un decompilador nuevas claves se pueden generar.

He implementado la activación de una sola vez en Internet sobre el software (C # .NET) de mi empresa que requiere una clave de licencia que se refiere a una licencia almacenada en la base de datos del servidor. El software realiza el servidor con la llave y se da información sobre la licencia que a continuación se cifra localmente usando una clave RSA generado a partir de algunas variables (una combinación de CPUID y otras cosas que no cambiará a menudo) en el equipo cliente y luego lo almacena en el registro.

Se requiere algo de código del lado del servidor, pero ha funcionado muy bien para nosotros y yo era capaz de utilizar el mismo sistema cuando se expandió a un software basado en navegador. También da a su personal de ventas gran información sobre quién, dónde y cuándo se está utilizando el software. Cualquier sistema de licencias que sólo se maneja a nivel local es totalmente vulnerables a la explotación, especialmente con la reflexión en .NET . Pero, como todo el mundo ha dicho, ningún sistema es totalmente seguro.

En mi opinión, si usted no está utilizando una licencia basada en web, no tiene sentido real para proteger el software en absoluto. Con el dolor de cabeza que puede causar DRM, que no es justo para los usuarios que realmente han pagado por lo sufriera.

Creo firmemente, que el sistema de criptografía de clave pública única basada licencias es el enfoque correcto aquí, porque usted no tiene que incluir la información esencial necesaria para la generación de la licencia en su código fuente.

En el pasado, he utilizado Licencias Biblioteca de Treek muchas veces, porque fullfills que estos requisitos y ofrece muy buen precio. Utiliza la misma protección de licencia para usuarios finales y la propia y nadie agrietado que hasta ahora. También puede encontrar buenos consejos en el sitio web para evitar la piratería y el agrietamiento.

Como algunos otros mencionan, yo soy un gran oponente de ser hostil a los clientes de forma predeterminada, algo que la industria de las licencias es conocido por. Así Voy a ampliar en una buena solución para el problema que también ofrece un buen cliente UX .

Para empezar, se ha mencionado que tiene una versión "limitada" del software que está utilizando para tratar de convertir a los clientes a "actualizar" para funciones adicionales. Así que lo que estás buscando son característica licencias para su producto, por ejemplo, un cliente puede comprar una licencia para función X- o función de Y .

Keygen con este tipo de licencias en mente. Keygen es una API REST de licencia que le permite administrar cuentas de usuario, licencias y también un seguimiento de las máquinas de uso / asociaciones.

Lo que me gustaría hacer es configurar 2 tipos de licencia (a política dentro Keygen) donde uno es una política de base para la versión gratuita limitada, y la otra es una política para la versión de pago.

No estoy seguro de lo que estás usando para los pagos, pero vamos a suponer que usted está usando algo como raya (bastante estándar hoy en día) que las ofertas de WebHooks . Keygen también tiene WebHooks (si se utiliza o no, todo esto sigue siendo aplicable). Puede integrar Keygen para hablar con su proveedor de pagos mediante WebHooks desde ambos lados. (Piensa: customer.created-> crear licencia básica para el cliente, license.created-> cliente carga para la nueva licencia)

Así que mediante la utilización de WebHooks, podemos automatizar la creación de licencias para los nuevos clientes. Entonces, ¿qué acerca de la validación de licencia dentro de la propia aplicación? Esto se puede hacer en una variedad de maneras, pero la forma más popular es, al exigir a su cliente que introduzca una clave de licencia de largo en un campo de entrada que luego se puede validar; Creo que esta es una manera terribles para manejar validación de la licencia de la aplicación.

¿Por qué pienso eso? Bueno, primero, que está requiriendo su cliente para introducir una clave de licencia tediosamente larga que está destinado para el consumo de la máquina, y el segundo que requiere su usted y su cliente para realizar un seguimiento de dicha clave tediosamente larga licencia .

Está bien, así que lo que es una alternativa? Creo que la mejor alternativa es hacer algo todos sus clientes están acostumbrados a: que les permite crear una cuenta para su producto utilizando un correo electrónico / contraseña . A continuación, puede asociar todas sus licencias y sus máquinas con esa cuenta. Así que ahora en lugar de introducir una clave de licencia, simplemente pueden iniciar sesión con sus credenciales.

¿Qué ventaja tiene que dar? En primer lugar, se deshace de la necesidad de que usted y sus clientes para realizar un seguimiento de las claves de licencia, ya que todo manejado detrás de las escenas de interiores de su cuenta de usuario y lo más importante: ahora puede ofrecer a sus clientes de autoservicio activación de la licencia y la máquina es decir, ya que todas sus licencias y máquinas están asociados con su cuenta de usuario, se puede! impulsarlos a comprar una licencia cuando el fuego de su aplicación en una máquina no reconocido.

¡Ahora la 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 feature- X o característica-y . Y puesto que su aplicación es ahora autoservicio , puede permitir a sus clientes adquirir características adicionales directamente desde dentro de la aplicación!

Para ello hemos introducido un t de la automatización en nuestro sistema de licencias, podemos licencia individual Características (es decir, una limitada frente a la versión completa), hemos ofrecido un impresionante UX para nuestros clientes y también hemos aliviado una de las mayores razones por las solicitudes de apoyo:. licencia de recuperación de claves

De todas formas, esto tiene mucho pero espero que ayude a alguien!

No es posible prevenir la piratería de software completo. Puede evitar la piratería casual y eso es lo que todas las soluciones de concesión de licencias de sus tareas.

Nodo (máquina) de licencia llave es lo mejor si se quiere evitar la reutilización de claves de licencia. He estado usando Cryptlex alrededor de un año ahora para mi software. Cuenta con un plan gratuito también, así que si usted no espera demasiados clientes se puede utilizar de forma gratuita.

Puede utilizar una solución libre de terceros para manejar esto para usted como Quantum-Key.Net Es gratis y se encarga de los pagos a través de PayPal a través de una página web de venta que crea para usted, expedición de claves a través de correo electrónico y bloquea el uso clave para una equipo específico para evitar la piratería.

También debe tener cuidado para ofuscar / cifrar su código o que puede ser fácilmente ingeniería inversa usando software como De4dot y .NetReflector. Un buen código Ofuscador libre es ConfuserEx cual es rápido y fácil de usar y más eficaz que las alternativas costosas.

Debe ejecutar su software terminado a través de De4Dot y .NetReflector a ingeniería inversa y ver lo que una galleta vería si lo hicieran lo mismo y para asegurarse de que no queda ningún código importante expuestos o no disimulada.

El software seguirá siendo manipulable pero para el cracker informal bien puede ser suficiente para ponerlos fuera y estos sencillos pasos también evitará que su código se extraen y reutilizarse.

https://quantum-key.net

Cómo utilizar ConfuserEx?

https://github.com/0xd4d/de4dot

https://www.red-gate.com / dinámico / productos / dotnet-desarrollo / reflector / descarga

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top