Buenas pretendo añadir a un software Java un sistema para verificar que el usuario que lo utiliza tiene licencia para hacerlo(para controlar el pago de las cuotas), en este sentido soy bastante realista y sé que no hay nada seguro al cien por cien, dicho esto me gustaría saber cual es el método mas seguro de hacerlo.
De momento mi planteamiento es crear un servidor de autenticación de licencias en un cualquier hosting, la idea es incluir en cada copia del software dentro de algún proceso critico del mismo( por ejemplo al arrancar el programa y al iniciar una sesión de usuario) una llamada a dicho servidor con una clave, tipo las API KEY de las redes sociales, y que este servidor devuelva una respuesta que acepte o bloquee el programa, creo que es la mejor manera de hacerlo.
Respecto a esta idea aún sin haberle dado muchas vueltas me surgen varias dudas:
1.- No se si será necesario utilizar, además de SSL, algún sistema criptográfico de cifrado en el proceso,lo digo para evitar que el servidor de autenticación devuelva un simple true o false ya que sería bastante facil de burlar el sistema, conozco algunos sistemas de cifrado pero la verdad no se en que caso se debe utilizar cada uno, y en este caso concreto no se cual será mejor utilizar.
2.- Respecto a los String donde se almacena la API KEY que utilice la copia del programa, así como la URL donde este servidor de autenticación me preocupa la facilidad de localizar un string cuando se hace una descompilación del programa, ya que estos se pueden leer tal cual, tan solo habría que monitorizar el tráfico cuando se inicia el programa, localizar la llamada al servidor de autenticación y buscar dicha URL en el código descompilado para saber en que parte se realiza el proceso de validación, con lo que una vez localizado el trozo de código conseguir burlarlo puede ser un proceso bastante sencillo, se me ocurre a modo casero guardar el String como distintos caracteres en distintas variables para que no sea guardado en tiempo de compilación al completo, y utilizar un sistema que monte dicho String en tiempo de ejecución, de este modo solo estaría almacenado en la memoria RAM lo que dificulta mas su localización, pero no estaría visible en el código descompilado, eso es lo primero que se me ha ocurrido no se como se hace esto habitualmente en la práctica.
Puede que parezca complicarlo demasiado y probablemente nadie intentará crackear el programa, pero el sistema tengo que hacerlo igualmente para controlar las cuotas y ya que lo hago prefiero hacerlo bien.
Además de esto utilizaré algún programa para la ofuscación del código, no se que cosas se me han podido escapar, así que estoy abierto a cualquier idea o consejo.