java licensing ntp systemtime

java - ¿Cómo evitar el uso de la licencia vencida a través de la manipulación del reloj del sistema?



licensing ntp (5)

Codifique su aplicación para enviarle correos electrónicos con el uso de sesión del usuario y verifique los tiempos de llegada. Automatiza el seguimiento del correo electrónico! De lo contrario, serás esclavo de tu éxito.

Jorge

Actualmente estoy trabajando en un administrador de licencias con java. Especificaré una fecha de inicio y finalización para mi aplicación, por lo que puedo obligar a un usuario con licencia a volver a licenciar el programa después de un cierto período de tiempo.

Pero el problema al que me enfrento es que cualquiera puede revertir la fecha y la hora del sistema para mantener la validez de la licencia. ¿Hay alguna forma en Java para detectar la fecha y hora del sistema se cambia. Ya probé Network Time Protocol para obtener la fecha y la hora actuales de un servidor de hora.


Como dijo @aioobe, las aplicaciones no tienen control sobre el entorno en el que se ejecutan.

Lo que puede hacer (si su programa también mantiene datos que son importantes para sus usuarios) es registrar lo que sabe sobre la fecha / hora y el paso del tiempo. Por ejemplo, puede almacenar la hora actual en un intervalo regular después de verificar que no retrocedió (cuando se detecta una reversión, emita un mensaje con un código encriptado para que se lo vuelva a autorizar a fin de que sepa que eso sucedió).

También puede mantener un "contador" que se incrementa cada hora que su programa se ejecuta, lo que le brinda otra forma de estimar el uso de su licencia.

Al usar los tres, su licencia se agotaría después de un año, una reversión o x horas de tiempo de ejecución.


Es básicamente imposible hacer nada al respecto. Un usuario podría "restaurar" toda su computadora para que el software piense que se está ejecutando en cualquier fecha en particular.

Podría hacer que sea más difícil si deja que el programa pida tiempo al servidor. (Aun así, si alguien realmente quisiera usar una licencia anterior, podría redirigir dicho tráfico a un servidor de hora local).

Preguntas / respuestas relacionadas:


Es probable que esté almacenando un archivo de licencia en el sistema. a) incluya la hora en que se registró el software en el archivo de licencia, b) firme digitalmente el archivo.

La firma digital le dirá si el archivo de licencia fue manipulado. Si no, la hora le dirá cuándo se registró el software; Si la "hora actual" es menor que la hora registrada, su administrador de licencias sabe que algo raro está sucediendo y puede responder de acuerdo (rechazar ejecutar, eliminar la licencia, ...

Si realmente desea imponer el intervalo de fechas, escriba la hora actual en cada ejecución del programa en un archivo separado firmado digitalmente, verificando que la hora siempre aumenta monótonamente.

También puede comparar su última hora registrada con cualquier archivo que su aplicación escriba y luego lea. Un archivo de este tipo con una fecha posterior a la última vez que se registró indica algún tipo de restauración del archivo de licencia.

Esto no impedirá que el usuario ajuste el reloj un poco, pero hará que sea bastante difícil para él hacerlo de forma organizada.


Tienes un par de escenarios para combatir:

  1. El usuario que hace retroceder el reloj de su sistema antes de instalar su producto, y
  2. El usuario que hace retroceder el reloj del sistema después de que se haya instalado.

Hay varios niveles de seguridad que puede aplicar, y si esta es una de las principales preocupaciones, puede utilizar todos ellos.

Lo más seguro es comparar la hora con una referencia externa, por ejemplo, su servidor. Si no hay acceso a la red, puede usar los métodos locales descritos anteriormente, de usar archivos locales (ocultos) para realizar un seguimiento de la hora en el sistema, de modo que pueda detectar la reversión. Al usar más de un archivo en más de una ubicación, y hacer que se comprueben entre sí, puede hacer que esto sea arbitrariamente difícil de revertir sin detección (y siempre puede intentar conectarse periódicamente al servidor externo).