none
¿Como puedo proteger los campos usuario y contraseña de mi cadena de conexion? RRS feed

  • Pregunta

  • Buenas noches! sere breve ya que mi duda es simple de entender. Mi problema es que en los App.Config de mi proyecto, tengo los datos para poder realizar la conexion con mi base de datos, los cuales deberia proteger que que simplemente abriendo el appconfig con un block de notas, se podria robar facilmente los datos para iniciar sesion en SQL. Ví que viene un metodo de encriptacion propia de cada maquina pero no se si es lo ideal. De que forma me recomientas proteger estos datos?

    Lo que se veria en mi appconfig (lo que esta en mayuscula es lo que me interesa proteger):

        <add name="DatabaseConnection" connectionString="data source=LAPTOP-MM9C4PM3\TOMASGAVAGNIN;initial catalog=BDRestaurante;user id=USUARIO;password=CONTRASEÑA;" providerName="System.Data.SqlClient" />
        <add name="BDRestauranteEntities" connectionString="metadata=res://*/modBDRestaurante.csdl|res://*/modBDRestaurante.ssdl|res://*/modBDRestaurante.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=LAPTOP-MM9C4PM3\TOMASGAVAGNIN;initial catalog=BDRestaurante;user id=USUARIO;password=CONTRASEÑA;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />


    Codigo que se introduciria en el CMD especificando el archivo para encriptarlo:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" Carpeta_Con_App.Config

    Desencripta:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" Carpeta_Con_App.Config

    Sacado de este video


    tomasgavagnin



    • Editado Orion1998 martes, 26 de noviembre de 2019 0:27
    martes, 26 de noviembre de 2019 0:25

Respuestas

  • Ahora bien, dicho lo anterior, yo te recomendaría que mejor todavía utilices autenticación integrada. Para ello, suprime el usuario y contraseña de la cadena de conexión y en su lugar pon "Integrated Security=True". Después, en la base de datos, añades un login para la cuenta del Pool de IIS en el que hayas instalado la aplicación, y de esa manera la conexión a base de datos se hace sin que figure en ningún sitio el usuario y contraseña.
    • Marcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:49
    martes, 26 de noviembre de 2019 8:00
    Moderador
  • hola

    >>abriendo el appconfig con un block de notas, se podria robar facilmente los datos para iniciar sesion en SQL

    pero sabes que para que esto suceda esa persona deberia acceder fisicamente o quizas por remote desktop a la pc para poder ver el connection string

    digo, navegando por la web no va acceder nunca a ese archivo

    quien puede seguramente accederlo va a ser un empleado de la empresa que tenga acceso

    >>Ví que viene un metodo de encriptacion propia de cada maquina pero no se si es lo ideal.

    es correcta esa forma de aplicar seguridad, encriptando la seccion de configuracion

    pero no necesitas desencriptarlo, salvo que vayas a cambiarlo, sino el codigo puede acceder directo al valor

    Protecting Connection Strings and Other Configuration Information (C#)

    si necesitas aplicar la encriptacion en una pc y llevarlo a otra usa la opcion de DPAPI

    porque necesitas de un certificado publico privado para usar este en la encriptacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:48
    martes, 26 de noviembre de 2019 2:05

Todas las respuestas

  • hola

    >>abriendo el appconfig con un block de notas, se podria robar facilmente los datos para iniciar sesion en SQL

    pero sabes que para que esto suceda esa persona deberia acceder fisicamente o quizas por remote desktop a la pc para poder ver el connection string

    digo, navegando por la web no va acceder nunca a ese archivo

    quien puede seguramente accederlo va a ser un empleado de la empresa que tenga acceso

    >>Ví que viene un metodo de encriptacion propia de cada maquina pero no se si es lo ideal.

    es correcta esa forma de aplicar seguridad, encriptando la seccion de configuracion

    pero no necesitas desencriptarlo, salvo que vayas a cambiarlo, sino el codigo puede acceder directo al valor

    Protecting Connection Strings and Other Configuration Information (C#)

    si necesitas aplicar la encriptacion en una pc y llevarlo a otra usa la opcion de DPAPI

    porque necesitas de un certificado publico privado para usar este en la encriptacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:48
    martes, 26 de noviembre de 2019 2:05
  • Ahora bien, dicho lo anterior, yo te recomendaría que mejor todavía utilices autenticación integrada. Para ello, suprime el usuario y contraseña de la cadena de conexión y en su lugar pon "Integrated Security=True". Después, en la base de datos, añades un login para la cuenta del Pool de IIS en el que hayas instalado la aplicación, y de esa manera la conexión a base de datos se hace sin que figure en ningún sitio el usuario y contraseña.
    • Marcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:49
    martes, 26 de noviembre de 2019 8:00
    Moderador
  • Hola Leandro! Obvio que al no estar conectado con la web no corro ese problema, lo principal seria por robo de datos o que alguien con minimos conocimientos de programacion actualice un campo de vencimientos de licencias para no pagar, ese era el principal problema.

    tomasgavagnin

    • Marcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:48
    • Desmarcado como respuesta Orion1998 martes, 26 de noviembre de 2019 14:49
    martes, 26 de noviembre de 2019 14:47
  • Tendre que investigar como hacer eso porque no lo hice nunca, seria mas comodo.

    tomasgavagnin

    martes, 26 de noviembre de 2019 14:48
  • ¿Tenes algun video o blog de como realizar eso?, ese codigo que pase funciona con ASP.NET ahora que lo veo, no con C# para winform

    tomasgavagnin


    • Editado Orion1998 martes, 26 de noviembre de 2019 16:15
    martes, 26 de noviembre de 2019 16:14
  • ¿Tenes algun video o blog de como realizar eso?, ese codigo que pase funciona con ASP.NET ahora que lo veo, no con C# para winform

    No tengo ningún documento a mano, pero no es nada complicado; de hecho, es más sencillo que usar usuario y contraseña. Ah, y por supuesto vale para ASP.NET, por eso te mencionaba el tema de "la cuenta del Pool en IIS". Obviamente no habría que mencionar semejante cosa si se tratase de una aplicación para WinfForms.

    Esencialmente, los pasos son estos:

    En la cadena de conexión, pon "Integrated Security=True". Esto es más sencillo que poner usuario y password incluso aunque no se encripten, no digamos ya si encima tienes que encriptarlos.

    En IIS Manager, fíjate qué cuenta tiene puesta en las propiedades Avanzadas del Pool al que hayas asignado tu aplicación al desplegarla en producción. Mira a ver si lo encuentras, y si no te intento poner unas capturas de pantalla. Si usas la configuración predeterminada, en la cuenta pondrá algo así como "ApplicationPoolIdentity", pero esto podrías camiarlo si fuera necesario. Nota: Si lo purebas en desarrollo desde dentro de Visual Studio (en lugar de ejecutarlo en produccioón desde IIS), la cuenta que usa es tu propia cuenta de usuario, por lo que dicha cuenta tendría que estar autorizada en el SQL Server que se use para las pruebas de desarrollo.

    Una vez que sepas esa cuenta, te vas a SQL Server y creas un Login mapeado a esa cuenta. Si fuera una cuenta "normal" tal como dominio\usuario, ese es el login que tienes que crear en SQL Server. Si es "ApplicationPoolIdentity", entonces depende de que el SQL Server esté en la misma máquina que el IIS o en otra distinta. Si es la misma hay que crear un Login para [NT Authority\Network Service]. Si es otra máquina, entonces [Dominio\NombreDelServidorIis$]. Sí, hay que molestarse en crear el Login en Sql Server, pero es más fácil crear uno de estos logins integrados que crear uno con usuario y contraseña, porque no hay que introducir la contraseña ni seleccionar sus opciones de complejidad y expiración. Y además no se necesita cambiar el servidor a "Modo mixto" como tienes que hacer para poder usar usuario y password.

    Finalmente, concedes permisos a ese Login sobre la base de datos utilizada por tu aplicación. Esto se hace exactamente igual que si el login al que se le conceden los permisos fuese con usuario y password.

    Y ya está, con eso tiene que funcionar todo.

    Solo tiene una limitación: Si el IIS y el SQL Server NO están en la misma máquina, entonces esos dos ordenadores tienen que formar parte de un mismo dominio de Directorio Activo para poder usar la autenticación integrada. Si no es este tu caso, entonces sí que tendrías que quedarte con la solución de usuario y pasword como tienes ahora. Pero si todo está en una máquna, o en dos máquinas del mismo dominio, entonces la autenticación integrada es la mejor solución.

    martes, 26 de noviembre de 2019 16:39
    Moderador
  • Leyendo el ultimo parrafo, me voy a tener que quedar con la opcion de usuario y contraseña, debido a que la aplicacion estaria en minimo 2 maquinas (la de minimo un mozo, y la de cocina). Fue error mio no poner que me referia a winform.

    tomasgavagnin

    martes, 26 de noviembre de 2019 20:44