miércoles, 28 de octubre de 2009

Encriptar el Web.Config

El verdadero titulo de este post deberia ser encriptar una sección del web config, pero estoy seguro que lo que quieren es ocultar el es el connectionString.
Vamos a utilizar el proveedor de configuración protegida
RSA y la herramienta aspnet_regiis.exe para poder lograr la encriptación de secciones del Web.Config.

Es posible importar y exportar las claves RSA de un servidor a otro, esto nos ayudará a utilizar el mismo cifrado en varios servidores.

Para encriptar la sección connectionString del Web.Config vamos a realizar los siguientes pasos:

1. Vamos a crear un sitio llamado EncriptacionRSA

2. Vamos a agregar el siguiente código en la sección connectionString dentro del archivo Web.Config

< connectionStrings >
< add name="MyLocalSQLServer"
connectionString="Initial Catalog=northwind;
data source=localhost;user id=sa;password=password"
providerName="System.Data.SqlClient"/ >
< /connectionStrings >


3. Ahora vamos a la línea de comandos para ejecutar la siguiente instrucción:

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pe "connectionStrings" -app "/EncriptacionRSA"

El comando anterior, con el modificador -app, asume que hay un directorio virtual IIS llamado MachineRSA. Si está utilizando el servidor Web de Visual Studio .NET 2005 en lugar de IIS, utilizaremos el modificador -pef, que nos permitirá especificar la ubicación física del directorio del Web.Config

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis.exe -pef "connectionStrings" C:\Projects\EncriptacionRSA

Si el comando es ejecutado de forma correcta deberemos de obtener el siguiente resultado:

Encrypting configuration section...
Succeeded!

Las claves RSA se almacenan en la siguiente ruta:

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

Una vez que ejecutamos esto, en el archivo Web.Config tendremos el siguiente resultado:

< connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider" > < EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" / >
< KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" / >
< KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< KeyName >Rsa Key< /KeyName >
< /KeyInfo >
< CipherData >

< CipherValue>R7cyuRk+SXJoimz7wlOpJr/YLeADGnwJVcmElHbrG/B5dDTE4C9
rzSmmTsbJ9Xcl2oDQt1qYma9L7pzQsQQYqLrkajqJ4i6ZQH1cmiot8ja7Vh+yItes7TRU
1AoXN9T0mbX5H1Axm0O3X/285/MdXXTUlPkDMAZXmzNVeEJHSCE=
< /CipherValue >
< /CipherData >
< /EncryptedKey >
< /KeyInfo >
< CipherData >

< CipherValue>d2++QtjcVwIkJLsye+dNJbCveORxeWiVSJIbcQQqAFofhay1wMci8FFlb
QWttiRYFcvxrmVfNSxoZV8GjfPtppiodhOzQZ+0/QIFiU9Cifqh/T/7JyFkFSn13bTKjbYmHObKA
zZ+Eg6gCXBxsVErzH9GRphlsz5ru1BytFYxo/lUGRvZfpLHLYWRuFyLXnxNoAGfL1mpQM7M46x5Y
WRMsNsNEKTo/PU9/Jvnh/lT+GlcgCs2JRpyzSfKE7zSJH+TpIRtd86PwQ5HG3Pd2frYdYw0rmlml
I9D
< /CipherValue >
< /CipherData >
< /EncryptedData >
< /connectionStrings >

Ahora vamos a comprobar si el encriptación y desencriptación funciona correctamente, para esto vamos a nuestra página Default.aspx y vamos a agregar el siguiente código de la sección HTML

< %@ Page Language="C#" % >
< script runat="server" >
protected void Page_Load(object sender, EventArgs e) {
Response.Write("Clear text connection string is: " + ConfigurationManager.ConnectionStrings
["MyLocalSQLServer"].ConnectionString);
}
< /script >

< html >
< body/ >
< /html >

MyLocalSQLServer es la cadena de conexión que especificamos en el Web.Config

Por último para regresar la sección del configurationString a su estado original vamos a ocupar el siguiente comando:

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pd "connectionStrings" -app "/EncriptacionRSA"

y para si ocupamos una ruta física ocupamos el siguiente comando:
%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pdf "connectionStrings" C:\Projects\EncriptacionRSA

Si el comando funciona correctamente obtendremos el siguiente resultado:

Decrypting configuration section...
Succeeded!

1 comentario:

Jesús Beltrán dijo...

Esto funciona para IIS6?, IIS7?, wserver 2003? 2008?