none
Proteger clave de la conection string RRS feed

  • Pregunta

  • Buenos días,

    Estoy intentando realizar un sistema de licencionamiento de una aplicación. Mi idea es que la aplicación vb.net, conecte con un servidor Mysql externo donde verificará si la licencia es correcta.

    Lo que me preocupa de esto es la contraseña de la conection string, por defecto la aplicación guarda la conexión en una string y a traves de un fichero y un algoritmo propio descifra ese fichero y obtiene la contraseña.

    Pero claro, el propio algoritmo de cifrado y los Hash esta en una DLL de la aplicación y me preocupa que alguien con EyeSpy o similares descompile el código de la DLL y descifre la contraseña de la base de datos Mysql y me monte un sidral... También había pensado en ofuscar el código, pero hasta donde tengo entendido solo sirve para ganar tiempo...

    En definitiva, ¿como puedo almacenar la contraseña de forma segura que nadie que use la aplicación pueda obtenerla?

    jueves, 22 de febrero de 2018 15:05

Respuestas

  • Básicamente: no puedes.

    Para que la aplicación pueda utilizar la clave, forzosamente tiene que contener todo lo necesario para descifrarla, y por lo tanto un hacker siempre podrá descifrarla. Podrás ponérselo más o menos difícil, enrevesando el código y recurriendo a ofuscación, pero en última instancia no existe forma de impedirlo por completo.

    Por ese motivo, en general en estos casos nunca se hace que la aplicación conecte directamente con la base de datos. Lo que se hace es meter una llamada a un servicio web, y ese servicio web es el que tiene internamente la conexión a base de datos. Los puestos remotos nunca ven la base de datos.

    • Propuesto como respuesta Pedro Abel jueves, 22 de febrero de 2018 15:28
    • Marcado como respuesta Pablo Rubio domingo, 25 de febrero de 2018 11:18
    jueves, 22 de febrero de 2018 15:17

Todas las respuestas

  • Básicamente: no puedes.

    Para que la aplicación pueda utilizar la clave, forzosamente tiene que contener todo lo necesario para descifrarla, y por lo tanto un hacker siempre podrá descifrarla. Podrás ponérselo más o menos difícil, enrevesando el código y recurriendo a ofuscación, pero en última instancia no existe forma de impedirlo por completo.

    Por ese motivo, en general en estos casos nunca se hace que la aplicación conecte directamente con la base de datos. Lo que se hace es meter una llamada a un servicio web, y ese servicio web es el que tiene internamente la conexión a base de datos. Los puestos remotos nunca ven la base de datos.

    • Propuesto como respuesta Pedro Abel jueves, 22 de febrero de 2018 15:28
    • Marcado como respuesta Pablo Rubio domingo, 25 de febrero de 2018 11:18
    jueves, 22 de febrero de 2018 15:17
  • Hola! Tienes algun ejemplo de implementacion de un servicio web que haga lo que indicas? Gracias! Sergio
    viernes, 23 de marzo de 2018 3:32
  • Haz una búsqueda de WebApi junto con OData. Encontrarás múltiples tutoriales y documentos.

    Básicamente lo que haces es generar en Visual Studio un proyecto WebApi2, le añades con Entity Framework el acceso a tus tablas de datos, y añades un controlador por cada tabla. Todo esto se puede hacer a golpe de clicks de ratón, no se necesita escribir casi nada de código.

    Desde el proyecto cliente, añades el paquete NuGet para consumir el servicio REST con OData, y te genera un proxy contra el que puedes ejecutar las consultas LINQ igual que si las hicieras directamente contra la base de datos, y por dentro ya se coordinan entre la clase proxy y el servicio WebApi para transmitirse las consultas con OData encapsulado en REST, sin que tú necesites saber cómo funciona internamente. Al final haces las consultas LINQ en tu programa igual que si usaras directamente LINQ-to-Entities contra la base de datos.

    viernes, 23 de marzo de 2018 7:52