2010-02-04 16 views
8

Estoy creando una aplicación de Windows normal que se distribuirá a varios usuarios en mi departamento. Tendré que incluir algunas contraseñas de conectividad en el archivo App.config, y obviamente no quiero que los usuarios finales simplemente activen el bloc de notas y observen las contraseñas.Encriptación de secciones y configuraciones en un archivo App.config que se redistribuirá

Varios artículos señalan cómo cifrar/descifrar las secciones de configuración, pero parece que tiene que compartir/enviar algunas claves con la solución implementable.

¿Hay una forma más simple de cifrar algunos de los ajustes para que no sean legibles por el usuario, pero que no requieran pasos o archivos adicionales al redistribuir el programa? Una gran ventaja sería que el acceso a la configuración de configuración sigue siendo transparente dentro del código .NET. Siempre podría simplemente crear un método personalizado para saltear/cifrar la cadena y en mi código personalizado descifrarlo, pero me pregunto si hay algo más simple.

Cualquier respuesta o enlaces a los artículos sobre cómo hacer esto son muy apreciados. Gracias

Respuesta

8

Si está intentando encriptar su cadena de conexión en su App.Config/Web.Config, puede hacerlo a través de la clase de configuración:

Configuration config = ConfigurationManager. OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigurationSection section = config.GetSection("connectionStrings"); 
if (section != null) 
{ 
    if (!section.IsReadOnly()) 
    { 
     section.SectionInformation.ProtectSection    ("RsaProtectedConfigurationProvider"); 
     section.SectionInformation.ForceSave = true; 
     config.Save(ConfigurationSaveMode.Full); 
    } 
} 

Hay dos métodos: RsaProtectedConfigurationProvider y DPAPIProtectedConfigurationProvider

Ver este ->http://www.codeproject.com/KB/cs/Configuration_File.aspx y http://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx.

+0

Bhaskar, ¿has probado esto? ¿Realmente encriptar la sección, redistribuyendo el archivo app.config protegido a otro desarrollador o máquina de usuario final, y ver si el descifrado transparente funciona automáticamente? – GR7

+0

Sí, he cifrado el archivo de configuración y lo he redistribuido en mi entorno de prueba. – Bhaskar

+1

Una solución como esta ("seguridad" por oscuridad) hará que te despidan en una empresa tecnológica competente. Si su código puede recuperar el texto plano, ¿qué le hace pensar que un atacante no puede usar el mismo código para ... recuperar el texto plano? Las únicas soluciones reales implican imponer restricciones de seguridad en el lado del servidor. – MickLH

0

De cualquier manera, el cifrado y descifrado del archivo de configuración de la aplicación no tiene sentido ya que el .EXE se puede examinar por Reflector!

Claro que puede ofuscar el código, pero eso hará que la depuración sea una pesadilla en un entorno de producción donde un extraño error desconocido/no descubierto se infiltró porque no podría decir qué/dónde/por qué/cómo controlar un extraño error que solo se mostrará en la versión ya que la pila y los mensajes de error se ofuscarán también ...

Eso es algo a tener en cuenta y una trampa potencial ... el usuario puede no ser conocedor de la tecnología, pero seguro podrían, en teoría, pedirle a un amigo/pariente/compañero que la piratee/rompa sin su conocimiento ... Esta respuesta no pretende desanimarlo, y espero que no se sienta ofendido por mi respuesta ...

Espero que esto hel ps, Saludos cordiales, Tom.

+0

gracias Tom, pero realmente no me importa que esté realmente encriptado, cifrado estaría bien. Mientras la contraseña no pueda verse simplemente abriendo la aplicación.config con un editor de texto, estoy bien. – GR7

+0

@silverCORE: Bueno ... la codificación rígida de la contraseña en el código es un no-no ... – t0mm13b

1

En resumen, la criptografía no es una varita mágica que puede reparar mágicamente un programa inseguro.

Un atacante intentará obtener contraseñas de la memoria utilizando un depurador mientras se ejecuta la aplicación. Las contraseñas también existirán en el binario y se pueden obtener fácilmente. El uso de cualquier cifrado se puede omitir porque la contraseña debe estar en texto sin formato en el momento del uso. Siempre que se utiliza memoria, también se puede observar con un depurador.

La respuesta está en contra de depuración: http://www.codeproject.com/KB/security/Intro_To_Win_Anti_Debug.aspx

Más ventanas avanzados anti-Depuración:

http://www.veracode.com/blog/2008/12/anti-debugging-series-part-i/

http://www.veracode.com/blog/2008/12/anti-debugging-series-part-ii/

http://www.veracode.com/blog/2009/01/anti-debugging-series-part-iii/

http://www.veracode.com/blog/2009/02/anti-debugging-series-part-iv/

+2

También puede usar SecureString para asegurarse de que la contraseña no aparezca en texto sin formato en la memoria en ningún momento. –

+2

@Ryan, eso es genial en teoría, pero en la práctica no hay SqlConnection aceptando un SecureString, y la cadena también tendrá que ser desencriptada en algún momento desde la lectura de la configuración y su transferencia a SecureString. – CodeCaster

Cuestiones relacionadas