En ciertos scenarios es requerido [y en general, recomendado] encriptar
información
sensible en los archivos .config, como pueden ser connection strings o determinadas keys propias de configuracion.
En este sentido, hoy ASP.Net a partir de la version 2.0 incorpora un mecanismo [comando aspnet_regiis]a traves del cual de forma "trasparente" permite encriptar secciones en el archivo Web.config.
La realidad es que esto tambien con una "pisada" [aka "tip"] puede aprovecharse para encriptar secciones en un App.config de una aplicacion SmartClient.
Cual es el procedimiento? Por ejemplo, para encriptar la sección de conectionStrings dentro de un App.config, tenemos que abrir la consola de VS, ubicarnos dentro del mismo directorio donde se encuentra el App.config y ejecutar las siguientes instrucciones:
- copy App.Config App.Config.original
- rename App.config web.config
- aspnet_regiis -pef connectionStrings . -prov DataProtectionConfigurationProvider
- rename web.config App.config
Esto hace que una seccion que antes se veia como:
<connectionStrings>
<add name="MyConnectionString" connectionString="Data Source=.;
Integrated Security=SSPI;Initial Catalog=MyApplicationDB;"
providerName="System.Data.SqlClient" />
</connectionStrings>
Ahora se vea como..
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAALNO8kQcyL0SKbOQ8HQGp0AQAAAACAAAA
AAADZgAAqAAAABAAAABv17Dh+HaRnrZppOfniJMaAAAAAASAAACgAAAAEAAAAF1mqOQdo+lvm45mQ
MwaiaKoAQAAHVHExOIDaItnnbRK7n/qHudiSUAq22t2qRTSxQDxE/lYyN2gA/cWHTw4njHVRu+MJN
awquuIFKW7RLFAlDYdJPA2xPHakwJXt6MLCOgdXmd+YojqP7AYHrPbFuRGF/8sNY+SlH0QOZya53D
AuljzMUQoE27BQbsCT+tLriMnGgmc8SaCjAFqqVc538zxxKLFnLZJLttHm5qAq7/y65abZDMjYo4Y
m4RpmhxQ5ZyITWpGt8RWabZ10MgWvcWS+QiL+ONVhs7lgR5wo0tDk1aoMh0f2VrSZPfXYoC8ZR2JV
0jqVSNasYmZN/+AO2G+6/S8YxETJqYD3BL8qFBtok9NUzvvoGMZYw+lJniSoLCBWtNoFpFM90/v0x
hCfRZZqiYj/8OOpJQT38ycG1N/zskhK/LAKe7loZGgPMl1wUjnFGpLOHW+f2ikVtYtHkH3+qxqny8
AeSZKovMnhfZlXUJx18G0Ugpvskmgju9aKtnE6UWLZbiiygJAfifQUjTwjFXgibQmuvFPxlWuUSW7
e6fBzVggx1zpDqnu5RGksN+zOg3S7IyiC79GihQAAAAWBM1NaI+3SdfalbKCGvuhxxTNSQ==
</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Si necesitamos modificar los datos y por ende precisamos desencriptar esta sección , necesitaríamos correr lo siguiente:
- copy App.Config App.Config.encriptado
- rename App.config web.config
- aspnet_regiis -pdf connectionStrings .
- rename web.config App.config
Este mismo concepto aplica a si creamos nuestras propias secciones en el .config, lo cual, es una buena práctica crear una sección que contenga las claves y valores sensibles y encriptar en particular esa sección. Ejemplo de creacion de una seccion:
..
<section name="secureAppSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
…
<secureAppSettings>
<add key="SomeService.UserName" value="secure-username"/>
<add key="SomeService.Password" value="secure-password"/>
</secureAppSettings>
Ejemplo de cómo leer las keys en el código:
[importar System.Collections.Specialized]
NameValueCollection secureAppSettings = (NameValueCollection)ConfigurationManager.GetSection("secureAppSettings");
Console.WriteLine("SomeService.UserName = " + secureAppSettings["SomeService.UserName"]);
Console.WriteLine("SomeService.Password = " + secureAppSettings["SomeService.Password"]);
Mas información en:
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx
http://www.dotnetprofessional.com/blog/post/2008/03/Encrypt-sections-of-WebConfig-or-AppConfig.aspx
Desde ya esperamos que la información resulte útil, gracias.
PP

6 comentarios:
Bueno,pero cmo llamaria a esa cadena de conexion desde mi aplicacio... lo he intentado pero no me sale.
ConfigurationManager.
ConnectionStrings
en este codigo me pide parametros... lo cual deberia.. cual seria la solucion... gracias...
Hola, gracias por comentar.
Mira, entiendo que .Net hace el decrypt solo, trasparente para nosotros.
Por lo cual, la accederias de la siguiente manera:
ConfigurationManager.ConnectionStrings["miconexion"].ConnectionString
Probaste esto?
gracias,
PP
no entendi mucho, tengo mi sistema terminado uso app.config y alli tengo la cadena de conexion, los formularios invocan mi cadena de conexion desde una clase y esta la devuelve cada vez que es invocada. Si deseo encriptar mi string de conexion en que afectaria esto a mi sistema.
Gracias
En realidad en tu aplicacion no necesitarias cambiar nada, es trasparente.
La aplicacion de este comando solo evita que se vea tu connection string en plano. No tiene impacto en la aplicacion en si misma.
Bueno, creo que yo tampoco entendi el truco, si pudieras explicarte un poco mejor, creo que lo entenderìa...
saludos...
En que puedo ayudarte? en el procedimiento? en el concepto?
En esencia para tu aplicacion accedes a las claves de configuracion totalmente igual a como si no estuvieran encriptadas.
Esto sirve de ayuda? gracias.
Publicar un comentario en la entrada