Este documento describe cómo cifrar y descifrar datos sensibles en aplicaciones web usando la Data Protection API (DPAPI) de Windows. Explica cómo usar la clase DataProtector para cifrar cadenas antes de almacenarlas y descifrarlas después, incluyendo valores almacenados en el archivo Web.config. También proporciona ejemplos de código para cifrar y descifrar cadenas y valores de configuración.
2. Introducción
Las aplicaciones Web muy a menudo
necesitan almacenar datos sensibles,
como las conexiones a las bases de datos
o las credenciales de una cuenta de
usuario en archivos de configuración. Por
razones de seguridad, este tipo de
información nunca debe ser almacenada
en texto plano y siempre debe ser cifrada
antes de su almacenamiento.
3. Objetivos
En este módulo aprenderemos a:
• Utilizar la clase librería que encapsula las
llamadas a la Data Protection API (DPAPI)
contenida en “Crypt32.dll” para cifrar y descifrar
datos.
• Cifrar las cadenas de conexión y almacenarlas
en el Web.config
• Crear una aplicación Web para cifrar y descifrar
datos.
5. Referencia y uso de Crypt32.dll
para DPAPI
Creación del proyecto Dataprotection que
emplea la librería DPAPI
Win32® Data Protection API (DPAPI).
Una de las caracteristicas de DPAPI es que
maneja las llaves
de cifrado por nosotros.
7. Cifrando cadenas
Private Sub btnEncrypt_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnEncrypt.Click
Dim dp As New
DataProtector(DataProtector.Store.USE_MACHINE_STORE)
Try
Dim dataToEncrypt() As Byte =
Encoding.ASCII.GetBytes(txtDataToEncrypt.Text)
txtEncryptedData.Text =
Convert.ToBase64String(dp.Encrypt(dataToEncrypt, Nothing))
Catch ex As Exception
lblError.ForeColor = Color.Red
lblError.Text = "Exception.<br>" + ex.Message
Return
End Try
lblError.Text = ""
End Sub
8. Descifrando cadenas
Private Sub btnDecrypt_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDecrypt.Click
Dim dp As New
DataProtector(DataProtector.Store.USE_MACHINE_STORE)
Try
Dim dataToDecrypt() As Byte =
Convert.FromBase64String(txtEncryptedData.Text)
txtDecryptedData.Text =
Encoding.ASCII.GetString(dp.Decrypt(dataToDecrypt, Nothing))
Catch ex As Exception
lblError.ForeColor = Color.Red
lblError.Text = "Exception.<br>" + ex.Message
Return
End Try
lblError.Text = ""
End Sub
9. Descifrando valores establecidos
en Config.Web
<appSettings>
<add key="connectionString"
value="AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAn5RQ1aAJME2AMmEpBWkVlg
QAAAACAAAAAAADZgAAqAAAABAAAACwMLkvl305PsddA94tM4E8AAAAAASAA
ACgAAAAEAAAAN+WvQ7eCbS3W3aZ1X8SEytIAAAAUwjfzcZvNVs4Bp439waR13/T
5tWYSdh/4nvuC1NO/0JWFrmW1ve19U6GPjxzxJo6QhUWdW8g0267d/GuUpZXnYD
WjuOl9gEnFAAAAA1H2b97Jaz4+YXpYthxSlDZXQLY" />
</appSettings>
En el archivo Web.Config
10. Descifrando valores establecidos
en Config.Web
Private Sub btnDecryptConfig_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles btnDecryptConfig.Click
Dim dp As New
DataProtector(DataProtector.Store.USE_MACHINE_STORE)
Try
Dim appSettingValue As String =
ConfigurationSettings.AppSettings("connectionString")
Dim dataToDecrypt() As Byte =
Convert.FromBase64String(appSettingValue)
txtDecryptedData.Text =
Encoding.ASCII.GetString(dp.Decrypt(dataToDecrypt, Nothing))
Catch ex As Exception
lblError.ForeColor = Color.Red
lblError.Text = "Exception.<br>" + ex.Message
Return
End Try
lblError.Text = ""
End Sub