Encriptar la cadena de conexión
Una de las recomendaciones que se hacen al trabajar con datos en .Net es: “escribe la cadena de conexión en un archivo de configuración, no lo escribas en el código”. Esto significa que la o las cadenas de conexión a todas las bases de datos que usemos en nuestro proyecto deben estar separadas del código fuente, en un archivo de configuración (App.config en el caso de una aplicación Windows o Web.config en el caso de una aplicación web).
Entonces, yo escribo en mi archivo de configuración, la siguiente sección:
<?xml version=”1.0” encoding=”utf-8” ?>
<configuration>
<connectionStrings>
<add name=“strCon” connectionString=“DataSource=(local);Initial Catalog=Pubs;Integrated Security=True” />
</connectionStrings>
</configuration>
Este ejemplo es el de un archivo App.config, y es obviamente un archivo de ejemplo, muy sencillo. Luego, en mi aplicación debo importar el siguiente namespace (hay que agragarlo a las referencias del proyecto también):
using System.Configuration;
Y ahora, para encriptar la cadena de conexión escribo el siguiente código:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConnectionStringsSection sect = config.ConnectionStrings;
sect.SectionInformation.ProtectSection(“DataProtectionConfigurationProvider“);
config.Save();
Y para desencriptarlo uso este código:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConnectionStringsSection sect = config.ConnectionStrings;
if (sect.SectionInformation.IsProtected){
sect.SectionInformation.UnprotectSection();
config.Save();
}
El resultado del archivo de configuración encriptado debe ser el siguiente:
<?xml version=”1.0” encoding=”utf-8” ?>
<configuration>
<connectionStrings configProtectionProvider=“DataProtectionConfigurationProvider”>
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA7461I+ToRU2uzk+aQdmrDQQAAAACAAAAAAADZgAAqAAAABAAAABMh/0ClY1svfK8dFXNTnDoAAAAAASAAACgAAAAEAAAAF
D+rETsqSKZZN//tqMoOH5QAQAA+lKl+gZANcW/C3Sm0jyNAyITWBkWZ1Am6gHcb1h9+enrJQ2p5+eIaJkqza8ja9RbvALosoQVo2NBJnA0k1LUopNIzTy8FDaftrdZSlMbVtqYrzwO7g0lvdnkaBNUI
cZo5LKhfIOpGIIoNId09SvlWEcDxn8rbBj5yKVzId4XOhtGLVFqt5+XkWqymFGlcnifXKdBK7DCtwKOVK2IYI/B5lyKleiG2g5ePSCMnqpsgkmuSUNVLcg0ONkGkIFSXBbUUHm8/emnisHoyER2Eb5Tk
4b346N8TiTZS7HqmOnqGBD323woeiFKuZNpwh9fbFrqo+Z+Wotrh2Ka6rxTdhAGutFJVWwOlVIOtOT98FcCZdhLHFhXm0Mh08RI+AUWbNJ4+1vkecuWC7GIxU+6uv7iG8I/Qz/BV0sb0gDDu4Fj0
Wa06+iw/xwjCTRkFXcyiHzNFAAAAABOwzLCJE+F+o3Dl50vBd4xKtMy</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
</configuration>
Pues bien, ese es todo el proceso, sencillo no?. La única recomendación es que el proceso de encriptación se debe realizar en el equipo en el que se desea, es decir si lo encriptas en una pc y luego lo quieres utilizar encriptado en otra pc, no funcionará, sobretodo si es una aplicación web.
Con este proceso, no hay demora en la lectura de la sección y baja en la performance, todo esta controlado por el FrameWork.
Aclaración: En algunos casos no se puede apreciar el resultado en un proyecto windows, por lo que recomiendo que generen la aplicación y prueben sobre el assembly generado.
Saludos.






Agosto 13th, 2007 at 5:15 pm
Hola h@nz , esta muy bien lo que haces al encriptar la sección conectionstring, pero tu sabes como encriptar la sección APPSETTINGS?
Enero 31st, 2008 at 7:39 pm
[...] ser… que el cifrado del archivo de configuración de tu aplicación no se adecue a la solución que buscas… puede ser… que necesites cifrar [...]
Enero 31st, 2008 at 7:39 pm
[...] ser… que el cifrado del archivo de configuración de tu aplicación no se adecue a la solución que buscas… puede ser… que necesites cifrar [...]
Febrero 7th, 2008 at 10:26 pm
Pregunta
si encripto de esta manera mi app.config, cualquier usuario que entre a la pc, puede desencriptarlo si corriera un programa con el trozo de codigo para desencriptar mi app.config.
Febrero 14th, 2008 at 11:35 pm
Para Armando Ventura, he probado y si se puede desencriptar la cadena con el mismo codigo …
Diciembre 11th, 2008 at 2:01 pm
Tengo una gran duda! tengo una pequenia aplicacion una agenda! y dentro de ella tengo una app.config y un Form solo eso, creo la aplicacion funciona de maravilla! pero el agenda.exe no me funciona en otra maquina porque ? ahora si junto con el ejecutable coloco el archivo con agendaProject.vshost.exe, estando los dos juntos funciona no entiendo ? como puedo hacer un ejecutable con un solo archivo y que corra en donde lo corra funcione ?
Julio 22nd, 2010 at 8:57 pm
Cómo sería para una aplicación web? Le he dado vueltas y no encuentro la forma, solo excepciones me saltan, pero creo que es porque todos los ejemplos (plageados, claro) que encuentro en blogs se refieren a aplicaciones windows.
Julio 22nd, 2010 at 9:05 pm
Ya encontré cómo, después de darme verga con un montón de pruebas, llegué a esto:
//para encriptar
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection section = config.Sections["connectionStrings"];
section.SectionInformation.ProtectSection(“DataProtectionConfigurationProvider”);
config.Save();
//para desencriptar
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection section = config.Sections["connectionStrings"];
section.SectionInformation.UnprotectSection();
config.Save();
Claro, esto es solo para la sección connectionStrings.