Encriptación de Secciones del Web.Config en ASP.NET 2.0 mediante RSA

Tagged: asp.net 2.0 encriptación web.config seguridad connectionstring

Siempre necesitamos proveer a nuestras soluciones un alto nivel de seguridad para evitar los posibles ataques tanto del exterior como dentro de nuestra propia empresa. Para lograr esto 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=aspnetdb;
       data source=localhost;Integrated Security=SSPI;"
       providerName="System.Data.SqlClient"/>
</connectionStrings>


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

%WinDir%\Microsoft.NET\Framework\<númeroVersión>\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\<númeroVersión>\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\<númeroVersión>\aspnet_regiis -pd "connectionStrings" -app "/EncriptacionRSA"

y para si ocupamos una ruta física ocupamos el siguiente comando:

%WinDir%\Microsoft.NET\Framework\<númeroVersión>\aspnet_regiis -pdf "connectionStrings" C:\Projects\EncriptacionRSA

Si el comando funciona correctamente obtendremos el siguiente resultado:

Decrypting configuration section...
Succeeded!

Espero que esto les ayude en sus aplicaciones y no olviden de colocar sus comentarios, si les parece bien todo esto, y recuerden postear en los foros, esta comunidad es para ustedes y sólo con la participación de todos haremos que sea la más grande de toda América Latina.

Saludos!
Víctor Alameda

Add a Comment