En mi trabajo, almacenamos las cadenas de conexión completas en el app.config, pero las encriptamos con AES256. Funciona bastante bien y agrega una buena cantidad de seguridad. Escribimos una pequeña herramienta que le permite encriptar y desencriptar cadenas de conexión, por lo que editar archivos app.config es bastante fácil. Solo tenemos la clave de encriptación codificada en la aplicación, por lo que si alguien se preocupó de descompilar los ensamblajes, podría resolverlo, pero eleva la barra lo suficientemente alto para nuestras necesidades. Aquí está la clase que utilizamos para cifrar y descifrar las cadenas de conexión:
Public Class Aes256Base64Encrypter
Public Function Decrypt(ByVal encryptedText As String, ByVal secretKey As String) As String
Dim plainText As String = Nothing
Using inputStream As MemoryStream = New MemoryStream(System.Convert.FromBase64String(encryptedText))
Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
Using cryptoStream As CryptoStream = New CryptoStream(inputStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read)
Dim outputBuffer(0 To CType(inputStream.Length - 1, Integer)) As Byte
Dim readBytes As Integer = cryptoStream.Read(outputBuffer, 0, CType(inputStream.Length, Integer))
plainText = Unicode.GetString(outputBuffer, 0, readBytes)
End Using
End Using
Return plainText
End Function
Public Function Encrypt(ByVal plainText As String, ByVal secretKey As String) As String
Dim encryptedPassword As String = Nothing
Using outputStream As MemoryStream = New MemoryStream()
Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
Using cryptoStream As CryptoStream = New CryptoStream(outputStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write)
Dim inputBuffer() As Byte = Unicode.GetBytes(plainText)
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length)
cryptoStream.FlushFinalBlock()
encryptedPassword = System.Convert.ToBase64String(outputStream.ToArray())
End Using
End Using
Return encryptedPassword
End Function
Private Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged
Const salt As String = "put a salt key here"
Const keySize As Integer = 256
Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Unicode.GetBytes(salt))
Dim algorithm As RijndaelManaged = New RijndaelManaged()
algorithm.KeySize = keySize
algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize/8, Integer))
algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize/8, Integer))
algorithm.Padding = PaddingMode.PKCS7
Return algorithm
End Function
End Class
En realidad, envuelto que en el interior de una clase ConnectionStringEncrpyter cuales hardcodes la clave secreta.
Creo que sí, gracias. – MarioDS
Dado que esta pregunta tiene muchas vistas, edité su respuesta para asegurarme de que la información no se pierda en caso de que el enlace se rompa. – MarioDS
@pylover _Esto responde a la pregunta pero no proporciona una solución adecuada_. Desde el enlace MS provisto; la ** nota dice **: 'La cadena de conexión solo se puede descifrar en la computadora en la que se cifró'. El [enlace de MS actualizado para el artículo podría proporcionar la solución] (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/protecting-connection-information) – wpcoder