Cifrado de archivo app.config

Tengo un archivo app.config que necesito distribuir con mi aplicación. Fue creado por una referencia de servicio a un servicio web ASMX que agregué.

No es un gran problema si este archivo es modificado / visto, pero aún me gustaría asegurarlo. Ya compruebo el hash de la configuración y me aseguro de que sea válida, pero aún quiero una capa adicional de protección.

Aquí está mi configuración: http://pastie.org/private/zjdzadnfwrjvwkmlbdsqw

Entonces, ¿hay algo allí que pueda encriptar o algo así?

No puede encriptar todo el – es un grupo de sección de configuración, que contiene secciones de configuración.

aspnet_regiis solo cifrará las secciones de configuración, por lo que debe encriptar selectivamente las partes que necesita, como esta:

 cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 aspnet_regiis.exe -pef "system.serviceModel/bindings" . aspnet_regiis.exe -pef "system.serviceModel/services" . 

etc.

Con esto, puede cifrar lo que necesita con facilidad; lo que no es demasiado importante, se puede dejar en texto claro.

Palabra de advertencia: dado que es aspnet_regiis , espera tratar con un archivo web.config : copie su app.config en una ubicación y app.config web.config , cifre sus secciones y copie las secciones encriptadas en su propia app.config .

O escriba su propia sección de configuración, encriptador / desencriptador, ¡son solo unas pocas líneas de código! O use la mía – escribí una pequeña utilidad ConfigSectionCrypt , venga de mi OneDrive – con fuente completa (C # – .NET 3.5 – Visual Studio 2008). Le permite cifrar y descifrar secciones de cualquier archivo de configuración; simplemente especifique el nombre del archivo en la línea de comando.

Utilizo lo siguiente para encriptar mis cadenas de conexión en web.config, ¿por qué no utilizar el mismo para usted? No estoy seguro sin embargo.

Para encriptar:

 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "\myWebSitePath" 

Para descifrar:

 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" "\myWebsitePath" 

Póngalos en archivos bat para que pueda cifrar o descifrar sobre la marcha.

Bueno, el progtwig leerá el archivo cuando se ejecute, por lo que cambiarlo podría ser una mala idea. Podría agregar sums de comprobación a cada línea para asegurarse de que sea válida, verificándola en su aplicación o buscando modificaciones desde la última ejecución o algo . Nunca he escuchado hablar de encriptar una aplicación.config antes para ser honesto.

No es un gran problema si este archivo es modificado / visto …

En ese caso, ¿para qué es la seguridad?

Puede encriptar programáticamente secciones de un archivo de configuración con SectionInformation.ProtectSection .

Debe establecer una referencia a System.Configuration.dll en su proyecto para que se ejecute el código.

 ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap(); configFileMap.ExeConfigFilename = exeConfigName; System.Configuration.Configuration myConfig = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); ConnectionStringsSection section = myConfig.GetSection("connectionStrings") as ConnectionStringsSection; if (section.SectionInformation.IsProtected) { // Remove encryption. section.SectionInformation.UnprotectSection(); } else { // Encrypt the section. section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); } myConfig.Save(); 

La respuesta de @marc_s es increíble, pero tuve problemas para entender exactamente cómo hacer lo que él había mencionado. Esta respuesta al foro de MSDN hace un muy buen trabajo explicando el mismo proceso en formato simplificado para personas como yo que todavía no están progtwigndo grandes proyectos. Aquí está el desglose:

La mejor manera de hacerlo es protegerlo mediante la aplicación aspnet_regiis.exe. Incluso si la aplicación no es una aplicación ASP.NET, esto seguirá funcionando. Así es cómo.

  1. Cambie el nombre de la aplicación.config en su directorio a web.config (no se preocupe, esto es solo temporal, la cambiaremos de nombre más adelante).
  2. Ve al prompt de comando.
  3. Escriba lo siguiente (reemplace el último argumento con la ruta que contiene el directorio a la app.config, actualmente renombrada a web.config. Por ejemplo, si la ruta completa a la configuración web es “C: \ documents and settings \ bob \ projects \ myproject \ web.config “, usaría” C: \ documents and settings \ bob \ projects \ myproject “)

% windir% \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis -pef “connectionStrings”

  1. Deberías verlo decir “¡Tuviste éxito!”
  2. Vuelva a abrir el web.config, debería verse algo como esto:
 < ?xml version="1.0" encoding="utf-8" ?>         Rsa Key   rUmEA8h02uMZ5M4uEVtL+5M/UvPuyJ4UJz5d/Pd4h4jpFPGVf29ha4d+BMt/iOupVisXDxuZY1jzyc6O0ZixGcCkZqbynwKjouVANQVWUnDgIFgVap2ohsxjblAMtWHTUWDlL0ST5tqSVHNQE+r9G59Bnrp5HkuU3Eg09/8j6Jo=     U2JEHzJ+WjSdlocT00cC9TE3+Dn3v7xE1RwX7bKAPuISO2f3hm18MZHnm1hXEBlnDS6iBNRPN87+BJJvZXYz+Sis/ZD4xBZEP4jBG2F8tqlLUbagv3W4epbuTSp2aalb5rdcBoycdIzSj2CApOzSaSKkMDvZrX8yoJI9RfuGnOWmNa4bncHkUEDvWq+uCK/8uaQ48J5uRoq7O0YgIe9jDg==     
  1. Por último, cambie el nombre del archivo de web.config a app.config.

¡Eso es! No deberías tener que hacer nada más para que esto funcione. Si usa el ConfigurationManager en su código para recuperar la configuración, debería buscarlo con el mismo código.

Dicho esto, si va a instalar esto en varias computadoras, es posible que desee considerar la posibilidad de proporcionar inicios de sesión específicos del usuario a su servidor para cada usuario que use la aplicación. De esta forma, aún puede hacer un seguimiento de lo que hace, y puede evitar que inicie sesión de usuario en usuario.