My kemenworld…

To mock or not to mock…

Encriptando una conexion en la configuración

Posted by kementeus en febrero 21, 2007

Un amigo preguntó hace poco en la comunidad .Net, ¿cómo encripto una conexión a la base de datos en la .Net Framework?. Me imagino que tal preguntá nació porque por default la configuración de las “connection strings” en el archivo de configuración creado por la .Net Framework se guarda en “texto plano” y bueno, cualquiera puede leer los datos de la conexión desde ahí. He aquí una pequeña explicación de como podríamos hacerlo.

En la .Net Framework de forma “plana” o sea sencilla, podemos hacerlo usando el método ProtectSection de cada uno de los objetos ConfigurationSection. Eso implica que podemos encriptar cualquier sección del archivo de configuración. Cómo lo encripta? bueno, en general hay dos formas o algoritmos, usando DPAPI (creo que significa Data Protection API, corrijanme si no) y RSA (la cual utiliza la idea de llaves públicas y privadas).

Bien, el detalle es que debemos por nuestra parte indicar primero que algoritmo usaremos para la encriptación (o bueno, que provider). Para RSA el provider se llama RSAProtectedConfigurationProvider (este es nuevo en la Framework 2.0) y para DPAPI se llama DataProtectionConfigurationProvider. Luego simplemente le decimos que sección queremos proteger. Resumiré con un programa sencillo que encripta una conexión:

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace EncriptMe
{
    class Program
    {
        static void Main(string[] args)
        {
            string protector = "DataProtectionConfigurationProvider";
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.ConnectionStrings;
            section.SectionInformation.ForceSave = true;
            section.SectionInformation.ProtectSection(protector);
            
            config.Save(ConfigurationSaveMode.Full);
        }
    }
}

(no olviden incluir System.Configuration.dll entre sus referencias).

La cadena de conexion “desaparece” en el archivo de configuración:

<configuration> 
<configSections/> 
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider"> 
<EncryptedData> 
<CipherData> 
<CipherValue>AQAAANCMnd8BFdERjHoAwE/....</CipherValue> 
</CipherData> 
</EncryptedData> 
</connectionStrings> 
</configuration>

En ASP.net podemos hacer lo mismo usando aspnet_regiis, el ejemplo anterior podemos hacerlo simplemente usando:

aspnet_regiis -pdf "ConnectionStrings" "{el archivo de configuracion}" -prov "DataProtectionConfigurationProvider"

(mas sobre esto en http://msdn2.microsoft.com/en-us/library/ms998280.aspx)

En el caso de usar RSA debemos exportar la llave que contiene nuestra PC, ya que es la usada para encriptar la data, los pasos estan en este link en la MSDN http://msdn2.microsoft.com/en-us/library/yxw286t2.aspx.

Bueno, en general hay excelente info en la MSDN library, http://msdn2.microsoft.com/en-us/library/zhhddkxy.aspx.

Espero que esto les sea de ayuda!

Una respuesta to “Encriptando una conexion en la configuración”

  1. estuardogt said

    Segun un mail que recibi de Microsoft, va a ver una reunion de programadores .NET aca en Guatemala, la pregunta es ¿En donde sera? ¿Cuando sera?
    Que bueno que una persona como vos, Cristian, asi de desinteresada este en este tipo de cosas.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: