miércoles 2 de abril de 2008

How To: Encriptar secciones de un Web.config o App.config..

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:

Anónimo dijo...

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...

Pablo Peralta dijo...

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

Anónimo dijo...

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

Pablo Peralta dijo...

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.

Lex dijo...

Bueno, creo que yo tampoco entendi el truco, si pudieras explicarte un poco mejor, creo que lo entenderìa...

saludos...

Pablo Peralta dijo...

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.