c# - from - encrypt connectionstring app config
Cifrar y desplegar app.config (2)
Leí y probé mucho para encontrar la mejor práctica para cifrar e implementar un app.config
en diferentes máquinas. En general, me gustaría asegurar el contenido de la cadena de conexión de terceros y desplegar la aplicación en diferentes máquinas. No configuraré cada máquina manualmente.
Sé que hay varias maneras como:
Aspnet_Regiis (RSAProtectedConfigurationProvider, DPAPIProtectedConfigurationProvider) enlazado a una máquina, usuario o personalizado. Clave de cifrado RSA.
System.Security.Cryptography.ProtectedData
enlazado a una máquina o usuario.Cifre la
app.config
en la primera ejecución. Lo cual no es seguro.
¿Qué recomienda o cuál es la mejor práctica para cifrar una aplicación app.config
y proporcionar la aplicación a diferentes máquinas mediante una configuración o con copiar y pegar?
Como ya mencioné en la pregunta, hay muchas formas diferentes de cifrar un archivo de configuración. Para una perspectiva más amplia, me gustaría describir una oportunidad adicional. No describiré la implementación concreta, más el concepto.
Con una acción personalizada en un instalador msi, puede cifrar el archivo de configuración directamente con la API de protección de datos de Windows (DPAPI). Para asegurar la segunda entropía puede usar un ofuscador. Como resultado, solo la aplicación puede cifrar el archivo de configuración.
Ventaja
- Muy seguro.
- No es necesaria la configuración de la máquina.
- Inserte la credencial durante la configuración.
Desventaja
- El archivo de configuración no está cifrado en la configuración. Tienes que protegerlo (permisos).
Por favor, siéntase libre de discutir y dar algún comentario a esta respuesta.
Paso 1 Crear un par de llaves RSA
aspnet_regiis -pc yourkey -exp
Paso 2 Exporta tu clave en el archivo XML
aspnet_regiis -px yourkey keyfile.xml -pri
para cada maquina
Paso 3 Importa tu contenedor
aspnet_regiis -pi yourkey keyfile.xml (see step 2)
para cada maquina
Paso 4 Editar machine.config (ruta canónica C: / Windows / Microsoft.NET / Framework [64 | 32] / v [Versión] / Config)
agregue en la sección configProtectedData este elemento a continuación y establezca defaultProvider = "YourProvider"
<add name="YourProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
description="Uses RsaCryptoServiceProvider to encrypt and decrypt for my infrastucture"
keyContainerName="yourkey"
cspProviderName=""
useMachineContainer="true"
useOAEP="false" />
Luego puede cifrar en una máquina y pegar en otra, recuerde que debe otorgar privilegios a los usuarios con
aspnet_regiis -pa yourkey [DOMAIN/USER]
El grupo de administradores ya está autorizado.
Para más información http://msdn.microsoft.com/en-us/library/yxw286t2(v=vs.90).aspx
Por supuesto, estos pasos se pueden poner en un archivo powershell / batch
Otra forma de cifrar una sección ConnectionStrings por código es
var connectionStrings = ConfigurationManager.GetSection("connectionStrings")
if(!section.SectionInformation.IsProtected)
connectionStrings.SectionInformation.ProtectSection("YourProvider");
En un escenario conectado y cliente / servidor, le propongo que la solución que he adoptado en una red amplia es no distribuir la cadena de conexión en app.config, sino que requiere la información de la conexión en un servicio que puede ser un servicio web o un servicio RESTful Después de la autenticación del usuario.
En el paso más o menos es así.
- Autenticar usuario
- Requerir información de conexión en el servicio con nombre de usuario como parámetro (protocolo HTTPS)
- una cadena de conexión de retorno de servicio
- App it connect en DB
Con esta solución, puede elegir a qué servidor se conecta el usuario si tiene un servidor regional o más servidores
Espero ser de ayuda