none
Como implementar el patron singleton en c#

    Question

  • Hola a todos como estan

    Tengo una capa de servicios web la cual posee una cadena de conexion encriptada en el archivo .config, el problema esta en que como se podran imaginar tengo que desencriptar la cadena cada vez que tengo que hacer una conexion a base de datos lo cual es constante... Necesito tener que desencriptarla una vez y no hacerlo mas pero no se como hacerlo...

    Se que existe el patron singleton no se si quiza me ayude a esto... Aqui esta como usarlo http://www.eslomas.com/index.php/archives/2005/08/09/patron-singleton-con-c-sharp/

    Pero la verdad no se como implementarlo para mi caso no se si deba agregar una variable tipo string a la cual siempre haga referencia para obtener mi cadena o que...

    Aqui tengo mi metodo de encriptación

    private static string dirPruebas = @"C:\Users\usuario\Desktop";
            private static string ficPruebas = Path.Combine(dirPruebas, "Claves.xml");

            static void Main()
            {
                if (File.Exists(ficPruebas) == false)
                {
                    crearXMLclaves(ficPruebas);
                }
                string xmlKeys = clavesXML(ficPruebas);
                byte[] datos = encriptar("texto", xmlKeys);
                string res = desencriptar(datos, xmlKeys);
                Console.WriteLine(res);
                Console.ReadLine();
            }
            private static void crearXMLclaves(string ficPruebas)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                string xmlKey = rsa.ToXmlString(true);

                string dirPruebas = Path.GetDirectoryName(ficPruebas);
                if (Directory.Exists(dirPruebas) == false)
                {
                    Directory.CreateDirectory(dirPruebas);
                }
                using (StreamWriter sw = new StreamWriter(ficPruebas, false, Encoding.UTF8))
                {
                    sw.WriteLine(xmlKey);
                    sw.Close();
                }
            }
            private static string clavesXML(string fichero)
            {
                string s;
                using (StreamReader sr = new StreamReader(fichero, Encoding.UTF8))
                {
                    s = sr.ReadToEnd();
                    sr.Close();
                }
                return s;
            }
            private static byte[] encriptar(string texto, string xmlKeys)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlKeys);
                byte[] datosEnc = rsa.Encrypt(Encoding.Default.GetBytes(texto), false);
                return datosEnc;
            }
            private static string desencriptar(byte[] datosEnc, string xmlKeys)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlKeys);
                byte[] datos = rsa.Decrypt(datosEnc, false);
                string res = Encoding.Default.GetString(datos);
                return res;
            }

     

    Como pueden ver guardar la clave de encriptacion y desencriptacion en disco por lo que hace mas lento el proceso "aunque me gustaria cambiar esto y tener la clave de encriptacion el archivo .config o algo asi" pero no supe como aplicarlo...

    Gracias a todos los que me puedan ayudar y saludos

    Friday, December 02, 2011 3:55 AM

Answers

  • hola

    pero si la aplciacion es web imagino con asp.net porque no usas lo qu este brinda para segurizar la configuracion

    me pregunto porque reinventar la rueda, si el propio framework provee mecanismos optimos y probados para hacerlo

    ademas si dejas el password en el config sin encriptar en un config que puede editarse con el notepad, me pregunto adonde queda la seguridad ? cualqueir podria ver el config y sacar el apssword que usas para aplicar la desencriptacion de tu codigo, la verdad muy poco seguro

     

    se hicieron anteriormente varias preguntas sobre el mismo tema

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/56497fff-1d79-4032-9450-d44734d859a8/

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/88245fab-92b2-48e6-a541-5ed2dd09cf7b/

    usa la seguridad RSA de esta forma el centificado podras exportarlo y llevarlo de una pc a otra donde realices el deploy

    pero veras que es transparente ya no necesitas mas sçningun singleton porque el

    ConfigurationManager solito toma el certificado y detecta que la seccion esta encriptada, aplica la logica y toma el valor real, tu no haces nada

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Edited by Leandro TuttiniMVP Friday, December 02, 2011 4:12 AM
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 4:10 AM
  • si revisas el articulo

    Encrypting and Decrypting Configuration Sections

    veras que dice

    The following command encrypts the connectionStrings element in the Web.config file for the application SampleApplication. Because no -site option is included, the application is assumed to be from Web site 1 (most commonly Default Web Site in IIS)

    Encrypting Web.Config

    veras que dice

    [-site site-name-or-ID] The site of the virtual path specified in -app. If not specified, the                       default web site will be used.

    quizas debas definir el site

     

     

    revisa ademas

    Herramienta Registro de IIS en ASP.NET (Aspnet_regiis.exe)

    tienes razon el -pef es valido y le asignas un path completo

    encrpyting web.config with command aspnet_regiis.exe

    veras que puedes usar

    aspnet_regiis.exe -pef "connectionStrings" C:\

    puede definri el path donde esta el web.config

     

     

    recuerda demas leer

    Importing and Exporting Protected Configuration RSA Key Containers.

    esto es para llevar luego la key que se genera de una pc a otra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 2:59 PM
  • hola

    porque usas en el parametro del comando un -pef y no solo -pe

    la "f" que seria ?

     

    aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider"

     

    saludls


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Edited by Leandro TuttiniMVP Friday, December 02, 2011 12:12 PM
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 12:12 PM

All replies

  • hola

    pero si la aplciacion es web imagino con asp.net porque no usas lo qu este brinda para segurizar la configuracion

    me pregunto porque reinventar la rueda, si el propio framework provee mecanismos optimos y probados para hacerlo

    ademas si dejas el password en el config sin encriptar en un config que puede editarse con el notepad, me pregunto adonde queda la seguridad ? cualqueir podria ver el config y sacar el apssword que usas para aplicar la desencriptacion de tu codigo, la verdad muy poco seguro

     

    se hicieron anteriormente varias preguntas sobre el mismo tema

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/56497fff-1d79-4032-9450-d44734d859a8/

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/88245fab-92b2-48e6-a541-5ed2dd09cf7b/

    usa la seguridad RSA de esta forma el centificado podras exportarlo y llevarlo de una pc a otra donde realices el deploy

    pero veras que es transparente ya no necesitas mas sçningun singleton porque el

    ConfigurationManager solito toma el certificado y detecta que la seccion esta encriptada, aplica la logica y toma el valor real, tu no haces nada

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Edited by Leandro TuttiniMVP Friday, December 02, 2011 4:12 AM
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 4:10 AM
  • hola

    pero si la aplciacion es web imagino con asp.net porque no usas lo qu este brinda para segurizar la configuracion

    me pregunto porque reinventar la rueda, si el propio framework provee mecanismos optimos y probados para hacerlo

    ademas si dejas el password en el config sin encriptar en un config que puede editarse con el notepad, me pregunto adonde queda la seguridad ? cualqueir podria ver el config y sacar el apssword que usas para aplicar la desencriptacion de tu codigo, la verdad muy poco seguro

     

    se hicieron anteriormente varias preguntas sobre el mismo tema

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/56497fff-1d79-4032-9450-d44734d859a8/

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/88245fab-92b2-48e6-a541-5ed2dd09cf7b/

    usa la seguridad RSA de esta forma el centificado podras exportarlo y llevarlo de una pc a otra donde realices el deploy

    pero veras que es transparente ya no necesitas mas sçningun singleton porque el

    ConfigurationManager solito toma el certificado y detecta que la seccion esta encriptada, aplica la logica y toma el valor real, tu no haces nada

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Hola amigo y wow la verdad asombrado, se ve muy interesante eso y lo mejor es que es transparente para la aplicacion... Pero en verdad necesito una mano porque no se que estoy haciendo mal... Quiero encriptar como la cadena de conexion como un solodato del app-settings

    Estoy ejecutando el siguiente comando en la consola de visual studio "mi aplicacion aun no esta en iis" y se llama ServidorWeb

    aspnet_regiis -pef "connectionStrings" -app "/ServidorWeb" -prov "RsaProtectedConfigurationProvider"

    Pero parece que estoy haciendolo mal, por que segun los articulos me dijiste deberia decir que fue exitoso y guardar elarchivo en una ruta que no se cual es porque esta ruta no la tengo yo \Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys... uso Windows 7

    Pero a mi lo que muestra es una lista de todos los codigos disponibles para usar.. algo asi..

     
                           -- ASP.NET REGISTRATION OPTIONS --

    -i                  Install this version of ASP.NET and update IIS
                        configuration at the root level to use this version of
                        ASP.Net.

    -ir                 Install this version of ASP.NET, register only. Do not
                        change any web applications to use this version.

    -iru                Install this version of ASP.NET. If there are any existing
                        applications that uses ASP.NET, it will not change IIS
                        configuration to use this version.

    tampoco se como hacer para encriptar un atributo del appsettings porque los ejemplos solo estan para la cadena de conexion

    Otra pregunta es, si yo luego monto mi aplicacion el el iss teng que hacer otra vez este proceso y luego substituir mi web.config?

    Enverdad agradezco tu ayuda porque me ayudara muchisimo,...

     

    Friday, December 02, 2011 5:12 AM
  • hola

    porque usas en el parametro del comando un -pef y no solo -pe

    la "f" que seria ?

     

    aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider"

     

    saludls


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Edited by Leandro TuttiniMVP Friday, December 02, 2011 12:12 PM
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 12:12 PM
  • hola

    porque usas en el parametro del comando un -pef y no solo -pe

    la "f" que seria ?

     

    aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider"

     

    saludls


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Hola amigo una vez mas agradecido...

    Segun la documentacion que lei dice que el pef es usado cuando la aplicacion no esta hospedada en iis si no que se esta usando el servidor virtual de visual studio...

    Pero bueno supongo que en este caso cuando este en  el servidor de visual  studio y la aplicacion no este montada no hace falta protegerla asi que no me dare mala vida con ello supongo que como a nivel de codigo es transparente puedo mientras este desarrollando usar el archivo .config sin encriptar y que luego cuando la aplicacion  pase a producccion generar la encriptacion de archivo, esto es posible cierto?

    Ahora bien, ya monte la aplicacion en el iis para ver si funciona y escribi...

    aspnet_regiis -pe "connectionStrings" -app "/Prueba" -prov "RsaProtectedConfigurationProvider"

    Donde Prueba es el nombre de mi sitio web en iis y dice

    The configuration for virtual path '/Prueba' and site 'Default Web Site' cannot be
    opened.
    Failed to map the path '/Prueba'.
    Failed!

    Sera que estoy metiendo algun dato mal? Ahora la otra pregunta "que es lo que mas me preocupa" es la siguiente,  cuando yo monte la aplicacion en iss lo que tengo que hacer es generar el archivo encriptado y sobreescribir el actual? Ese mismo archivo me va a funciona en cualquier pc? Me explico, como sabes cuando una hospeda la web por lo general lo hace en servidores que no son de una si no de alguna empresa, por lo general esas empresa te dan un panel de control para que tu la administre, es decir, no hay iis ni nada, como haria en ese caso?

    Gracias otra vez

    Friday, December 02, 2011 2:23 PM
  • si revisas el articulo

    Encrypting and Decrypting Configuration Sections

    veras que dice

    The following command encrypts the connectionStrings element in the Web.config file for the application SampleApplication. Because no -site option is included, the application is assumed to be from Web site 1 (most commonly Default Web Site in IIS)

    Encrypting Web.Config

    veras que dice

    [-site site-name-or-ID] The site of the virtual path specified in -app. If not specified, the                       default web site will be used.

    quizas debas definir el site

     

     

    revisa ademas

    Herramienta Registro de IIS en ASP.NET (Aspnet_regiis.exe)

    tienes razon el -pef es valido y le asignas un path completo

    encrpyting web.config with command aspnet_regiis.exe

    veras que puedes usar

    aspnet_regiis.exe -pef "connectionStrings" C:\

    puede definri el path donde esta el web.config

     

     

    recuerda demas leer

    Importing and Exporting Protected Configuration RSA Key Containers.

    esto es para llevar luego la key que se genera de una pc a otra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Pro2e Saturday, December 03, 2011 7:08 PM
    Friday, December 02, 2011 2:59 PM
  • si revisas el articulo

    Encrypting and Decrypting Configuration Sections

    veras que dice

    The following command encrypts the connectionStrings element in the Web.config file for the application SampleApplication. Because no -site option is included, the application is assumed to be from Web site 1 (most commonly Default Web Site in IIS)

    Encrypting Web.Config

    veras que dice

    [-site site-name-or-ID] The site of the virtual path specified in -app. If not specified, the                       default web site will be used.

    quizas debas definir el site

     

     

    revisa ademas

    Herramienta Registro de IIS en ASP.NET (Aspnet_regiis.exe)

    tienes razon el -pef es valido y le asignas un path completo

    encrpyting web.config with command aspnet_regiis.exe

    veras que puedes usar

    aspnet_regiis.exe -pef "connectionStrings" C:\

    puede definri el path donde esta el web.config

     

     

    recuerda demas leer

    Importing and Exporting Protected Configuration RSA Key Containers.

    esto es para llevar luego la key que se genera de una pc a otra

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Hola amigo muchas gracias

    El problema era la permisologia de Windows 7, se debe iniciar el command prompt de visual studio en modo administrador... Gracias por la ayuda en verdad solo me queda saber como podre hacer para creer el archivo cuando hostee mi pagina en algun hosting ya que ellos solo te dan un panel de control y no acceso a ninguna consola ni nada por el estilo...

    Gracias

    Saturday, December 03, 2011 7:08 PM