Las mejores maneras de conservar la información del cliente de la licencia en la base de datos

4

Desarrollo un servidor de licencias y un sistema cliente de licencias (aplicaciones basadas en Java).

El flujo es el siguiente:

  1. La licencia se almacena en el servidor de licencias
  2. La aplicación cliente incluye un componente de cliente de licencia.
  3. El cliente de licencias se conecta al servidor de licencias a través de HTTPS para recuperar la información de la licencia.
  4. La licencia no se pasa al cliente de la licencia, solo la información si la licencia está habilitada.
  5. Si la licencia está habilitada, el cliente de la licencia devuelve a la aplicación cliente el estado de la licencia y es posible utilizarla.
  6. Si la licencia no está habilitada, el cliente de la licencia inicia el período de evaluación (por ejemplo, 30 días). Durante este período, recomendamos a nuestros clientes que adquieran la licencia.
  7. Si se pasa el período de evaluación, el cliente de la licencia devuelve a la aplicación cliente el estado sin licencia y no es posible utilizar las aplicaciones cliente.

Tengo un dilema sobre cómo persistir el tiempo de inicio de la evaluación, ya que si un cliente puede comprometerlo y el período de evaluación volverá a comenzar. Almaceno el estado de la licencia en la base de datos utilizando el algoritmo AES-256, por lo que no creo que un cliente pueda descifrar la información. Además, si un cliente eliminará el estado de la licencia de la base de datos, no es posible utilizar la aplicación cliente, por lo que no me importa.

Similarmente, almaceno el tiempo de inicio de evaluación en la base de datos utilizando el algoritmo AES-256, por lo que no creo que un cliente pueda descifrar la información. Pero tengo un problema si un cliente eliminará el tiempo de inicio de evaluación de la base de datos. En este caso, comenzaré el período de evaluación desde el principio.

Quiero almacenar la información en la base de datos (para poder escalar en el futuro con la replicación de la base de datos). Además, no deseo almacenar el tiempo de inicio de evaluación en el servidor de licencias, ya que es un problema del cliente. Más detallado: en el futuro queremos admitir la licencia (y el tiempo de evaluación) para diferentes tipos de permisos. Por ejemplo, licencia para ejecutar un trabajo o licencia para editar un documento. Por lo tanto, el cliente puede tener una licencia completa para ejecutar un trabajo, pero puede estar en el período de evaluación para editar un documento.

Cualquier sugerencia es más que bienvenida.

    
pregunta Michael 16.04.2013 - 10:35
fuente

1 respuesta

1

Necesitas un servicio de sellado de tiempo. El servidor de licencias debe rastrear la información sobre el cliente que garantiza que el mismo cliente no puede solicitar una licencia más de una vez. Puede usar cualquier número de factores para esto, como los números de serie del disco duro, los códigos de activación de Windows, etc.

Cuando se emite una licencia de evaluación, puede hacer una marca de tiempo de la clave y hacer que la aplicación verifique un reloj para ver si la licencia sigue siendo válida. (Use un algoritmo asimétrico en el servidor de licencias para firmar una marca de tiempo y la información que identifica a la computadora). Tenga en cuenta que aún pueden alterar la hora del sistema local, por lo que la mejor opción es usar un reloj externo. Luego, su cliente simplemente necesita conocer la clave pública del servidor de licencias para que pueda verificar que la hora de inicio y la ID del equipo para la licencia sean válidas antes del inicio.

No confíe en la seguridad a través de la oscuridad. Cosas como poner los valores en una columna de la base de datos sin marcar, usar un cifrado simétrico como AES u otras medidas similares donde la información para generar una licencia se almacena en el cliente se puede romper fácilmente haciendo un simple seguimiento del comportamiento del programa para ver a qué accede. . Tan pronto como alguien llegue a lo que parece una clave AES o una licencia que se está cargando en la memoria, sabrá qué es. Este tipo de cosas es un juego de niños para un ingeniero inverso experimentado y tomará unos minutos en la mayoría de los casos.

En su lugar, asegúrese de que no les sirva de nada manipular la licencia y negarles la capacidad de generar una licencia válida. Use algoritmos asimétricos (clave pública / privada) para que solo el servidor sepa cómo generar una licencia y todo lo que el cliente sepa hacer sea validarlo. Asegúrese de que se haga una verificación de la hora con la marca de tiempo firmada en la licencia y que la licencia también contenga un identificador difícil de falsificar de la máquina cliente para que no se pueda usar para más de un cliente. De esa manera, copiar o modificar la licencia es muy difícil.

En ese momento, los ataques más exitosos contra su sistema serán la ingeniería inversa del código para deshabilitar la verificación de licencia (hacerlo varias veces a lo largo de su aplicación lo hará más difícil) o encontrar una manera de falsificar las verificaciones de identificación del cliente para hacer que varias computadoras se vean igual (o hacer que la computadora se vea diferente para obtener otra licencia de prueba)

    
respondido por el AJ Henderson 16.04.2013 - 15:36
fuente

Lea otras preguntas en las etiquetas