Exportar (0) Imprimir
Expandir todo

Cómo: Utilizar DPAPI (almacén del equipo) en ASP.NET

Publicado: 26 de junio de 2006

Consulte la Página de entrada como punto de partida y para obtener una descripción completa del documento Crear aplicaciones ASP.NET seguras.

Resumen: En este artículo se muestra cómo utilizar DPAPI en una aplicación Web ASP.NET o un servicio Web para cifrar datos confidenciales.

Es frecuente que las aplicaciones Web necesiten almacenar datos importantes para la seguridad, como cadenas de conexión de base de datos y credenciales de cuentas de servicio en archivos de configuración de aplicaciones. Por razones de seguridad, este tipo de información no debe almacenarse nunca en texto sin cifrar y debe cifrarse siempre antes de su almacenamiento.

En este artículo se describe cómo utilizar DPAPI en ASP.NET, lo que incluye aplicaciones Web ASP.NET, servicios Web y componentes .NET Remoting alojados en ASP.NET.

En el código incluido en este artículo se hace referencia a DPAPI mediante una biblioteca de clases administradas cuya creación se describe en "Cómo: Crear una biblioteca DPAPI" en la sección Referencia de esta guía.

Notas
DPAPI puede trabajar con el almacén del equipo o el almacén del usuario (lo que requiere que se cargue un perfil de usuario). De forma predeterminada, DPAPI utiliza el almacén del usuario, aunque se puede especificar que se utilice el almacén del equipo si se pasa el indicador CRYPTPROTECT_LOCAL_MACHINE a las funciones DPAPI.
El uso del perfil de usuario permite un nivel de seguridad adicional porque limita quién puede tener acceso al secreto. Sólo el usuario que cifra los datos puede descifrarlos. Sin embargo, el uso del perfil de usuario requiere mayor trabajo de desarrollo si se utiliza DPAPI en una aplicación Web ASP.NET, porque es necesario realizar pasos explícitos para cargar y descargar los perfiles de usuario (ASP.NET no carga automáticamente los perfiles de usuario).
El uso del almacén del equipo (que se adopta en este artículo) es más fácil de desarrollar porque no requiere la administración de perfiles de usuario. Sin embargo, a menos que se utilice un parámetro de entropía adicional, la seguridad es menor porque cualquier usuario del equipo puede descifrar los datos. (El parámetro de entropía es un valor aleatorio diseñado para hacer más difícil la posibilidad de descifrar el secreto.) El problema de utilizar un parámetro de entropía adicional es que debe almacenarse de forma segura en la aplicación, lo que presenta otro problema de administración de claves.

Nota

Si se utiliza DPAPI con el almacén del equipo, la cadena cifrada es específica de un equipo determinado y, por lo tanto, deben generarse los datos cifrados en todos los equipos. No copie los datos cifrados entre los equipos de un grupo o clúster de servidores.

Requisitos
A continuación se describen las recomendaciones de hardware, software, infraestructura de red, conocimientos y Service Pack que se necesitan.
Sistema operativo Microsoft® Windows® 2000
Sistema de desarrollo Microsoft Visual Studio® .NET
Para llevar a cabo los procedimientos de este artículo, también es necesario que tenga conocimientos acerca de cómo crear aplicaciones Web ASP.NET con la herramienta de desarrollo Microsoft Visual C#™.
Antes de trabajar con este artículo, debe realizar los pasos que se describen en "Cómo: Crear una biblioteca DPAPI" para crear la biblioteca de clases administradas DPAPI que se utiliza en el código incluido en este artículo.

En esta página

Crear una aplicación Web de cliente de ASP.NET Crear una aplicación Web de cliente de ASP.NET
Probar la aplicación Probar la aplicación
Modificar la aplicación Web para leer una cadena de conexión cifrada en Web.config Modificar la aplicación Web para leer una cadena de conexión cifrada en Web.config
Referencias Referencias

Crear una aplicación Web de cliente de ASP.NET

En este procedimiento se crea una aplicación Web de cliente de ASP.NET que llamará a la biblioteca de clases DPAPI para cifrar y descifrar los datos almacenados en el archivo Web.config.

Para crear una aplicación Web de cliente de ASP.NET

  1. Inicie Visual Studio .NET y cree una nueva aplicación Web ASP.NET en C# con el nombre DPAPIClientWeb

  2. Agregue una referencia al ensamblado DataProtector.dll que se creó anteriormente en "Cómo: Crear una biblioteca DPAPI".

  3. Abra WebForm1.aspx.cs y agregue las siguientes instrucciones using al principio del archivo debajo de las instrucciones using existentes.

    using System.Text;
       using DataProtection;
    
  4. Agregue a WebForm1.aspx los controles que se enumeran en la tabla 1.

    Tabla 1: Controles de WebForm1.aspx

    Tipo de control

    Texto

    Id.

    Botón

    Encrypt

    btnEncrypt

    Botón

    Decrypt

    btnDecrypt

    Cuadro de texto

    .

    txtDataToEncrypt

    Cuadro de texto

    .

    txtEncryptedData

    Cuadro de texto

    .

    txtDecryptedData

    Etiqueta

    .

    lblError

    Etiqueta

    Data To Encrypt

    .

    Etiqueta

    Encrypted Data

    .

    Etiqueta

    Decrypted Data

    .

    El formulario Web debe tener una apariencia similar al de la ilustración 1.

    imagen

    {Insert figure: DPAPIHowToWebForm.gif }

    Ilustración 1

    Formulario Web DPAPIClientWeb

  5. Haga doble clic en el botón Encrypt para crear un controlador de eventos de clic asociado.

    DataProtector dp = new DataProtector( DataProtector.Store.USE_MACHINE_STORE    );
       try
       {
       byte[] dataToEncrypt = Encoding.ASCII.GetBytes(txtDataToEncrypt.Text);
       // Not passing optional entropy in this example
       // Could pass random value (stored by the application) for added security
       // when using DPAPI with the machine store.
       txtEncryptedData.Text =
       Convert.ToBase64String(dp.Encrypt(dataToEncrypt,null));
       }
       catch(Exception ex)
       {
       lblError.ForeColor = Color.Red;
       lblError.Text = "Exception.<br>" + ex.Message;
       return;
       }
       lblError.Text = ";
    
  6. Vuelva al formulario Web y haga doble clic en el botón Decrypt. Agregue el siguiente código al controlador de eventos accionable al hacer clic.

    DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
       try
       {
       byte[] dataToDecrypt = Convert.FromBase64String(txtEncryptedData.Text);
       // Optional entropy parameter is null. 
       // If entropy was used within the Encrypt method, the same entropy parameter
       // must be supplied here
       txtDecryptedData.Text = 
       Encoding.ASCII.GetString(dp.Decrypt(dataToDecrypt,null));
       }
       catch(Exception ex)
       {
       lblError.ForeColor = Color.Red;
       lblError.Text = "Exception.<br>" + ex.Message;
       return;
       }
       lblError.Text = ";
    
  7. En el menú Generar, haga clic en Generar solución.

Probar la aplicación

En este procedimiento se prueba la aplicación Web para confirmar que los datos se cifran y descifran correctamente.

Para probar la aplicación

  1. Presione Ctrl+F5 para ejecutar la aplicación Web.

  2. Escriba una cadena en el cuadro de texto Data to Encrypt (Datos que se cifrarán) y haga clic en Encrypt (Cifrar).
    Confirme que los datos cifrados (en formato codificado con Base64) se muestran en el cuadro de texto Encrypted Data (Datos cifrados).

  3. Haga clic en el botón Decrypt (Descifrar).

    Confirme que los datos cifrados se han descifrado correctamente y se muestran en el cuadro de texto Decrypted Data (Datos descifrados).

Modificar la aplicación Web para leer una cadena de conexión cifrada en Web.config

En este procedimiento se toma una cadena de conexión de base de datos cifrada y se coloca el texto cifrado en el archivo Web.config de la aplicación dentro de un elemento <appSettings>. Después, se agregará código para leer la cadena en el archivo de configuración y descifrarla.

Para modificar la aplicación Web para leer una cadena de conexión cifrada en Web.config

  1. Vuelva a Visual Studio .NET y muestre el archivo WebForm1.aspx en el modo del diseñador.

  2. Agregue otro botón al formulario. Configure la propiedad Text en Decrypt string from config file (Descifrar cadena de archivo de configuración) y la propiedad ID en btnDecryptConfig.

  3. Haga doble clic en el botón para crear un controlador de eventos accionable al hacer clic.

  4. Al principio del archivo, agregue la siguiente instrucción using debajo de las instrucciones using existentes.

    using System.Configuration;
    
  5. Vuelva al controlador de eventos btnDecryptConfig_Click y agregue el siguiente código para recuperar una cadena de conexión de base de datos en la sección <appSettings> del archivo Web.config.

    DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
       try
       {
       string appSettingValue =
       ConfigurationSettings.AppSettings["connectionString"];
       byte[] dataToDecrypt = Convert.FromBase64String(appSettingValue);
       string connStr = Encoding.ASCII.GetString(
       dp.Decrypt(dataToDecrypt,null));
       txtDecryptedData.Text = connStr;
       }
       catch(Exception ex)
       {
       lblError.ForeColor = Color.Red;
       lblError.Text = "Exception.<br>" + ex.Message;
       return;
       }
       lblError.Text = ";
    
  6. En el menú Generar, haga clic en Generar solución para volver a compilar los proyectos.

  7. Haga clic con el botón secundario del mouse (ratón) en WebForm1.aspx y, a continuación, haga clic en Ver en el explorador.

  8. En el campo Data to Encrypt, escriba una cadena de conexión de base de datos como la que se indica a continuación.

    server=(local);Integrated Security=SSPI; database=Northwind
    
  9. Haga clic en el botón Encrypt.

  10. Seleccione el texto cifrado y cópielo en el portapapeles.

  11. Cambie a Visual Studio .NET, abra Web.config y agregue el siguiente elemento <appSettings> fuera del elemento <system.web>. Asigne la cadena de conexión cifrada que se encuentra en el portapapeles al atributo value.

    <appSettings>
       <add key="connectionString" value="encrypted connection string"    /> 
       </appSettings>
    
  12. Guarde Web.config.

  13. Haga clic en el botón Decrypt string from config file y confirme que la cadena de conexión de base de datos cifrada se lee correctamente en el archivo Web.config y que la cadena de conexión descifrada se muestra correctamente en el campo Decrypted data.

Referencias

Para obtener más información, consulte los siguientes artículos relacionados en la sección Referencia de esta guía:

Mostrar:
© 2014 Microsoft