2010-07-28 20 views
17

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é.Encriptación app.config Archivo

No es un gran problema si este archivo es modificado/visto, pero aún así me gustaría que sea seguro. 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í es mi config: http://pastie.org/private/zjdzadnfwrjvwkmlbdsqw

Entonces, ¿hay algo ahí que pueda cifrar o algo?

+0

http://stackoverflow.com/questions/855483/wcf-encryption-solution-for-app-config-viewable-to-a-client podría ayudar – PRR

Respuesta

36

No se puede encriptar todo <system.serviceModel> - es un grupo de sección de configuración, que contiene secciones de configuración.

El aspnet_regiis sólo habrá cifrar secciones de configuración - por lo que necesita para cifrar selectivamente aquellas piezas que necesita, así:

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, se puede cifrar lo que necesita fácilmente - lo que no es demasiado importante, se puede dejar en texto claro.

Una palabra de advertencia: ya que es aspnet_regiis, se espera que se trata de un archivo web.config - copiar su app.config a un lugar y lo llaman web.config, cifrar sus secciones, y copiar las secciones cifradas de nuevo en su propia app.config.

O escriba su propia sección de configuración encrypter/decrypter - ¡son solo unas pocas líneas de código! O use el mío - Escribí una pequeña utilidad de ConfigSectionCrypt, venga a tomarla 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.

+7

+1 para identificar la necesidad exacta de la pregunta –

+1

¡Excelente! Solo la respuesta que estaba buscando. Su aplicación de línea de comandos hizo el trabajo y la guardaré para usarla en el futuro. ¡Gracias por la ayuda! – Eaton

+0

El enlace skydrive parece estar fuera de servicio. ¿De otra manera podemos obtener la utilidad de línea de comandos? –

2

Bueno, el programa leerá el archivo cuando se ejecute, por lo que cambiar el archivo podría ser una mala idea; podría agregar sumas de comprobación a cada línea para asegurarse de que sea válida; última carrera o algo así. Nunca he escuchado hablar de encriptar una aplicación.config antes para ser honesto.

+0

Me gustaría sobre todo para ocultar la URL de mi secuencia de comandos de licencia de alguna manera. Sé que ningún método de encriptación de escritorio impedirá que alguien lo vea por completo, pero me gustaría ocultarlo al usuario estándar. – Eaton

+0

puede usar algún tipo de encriptación ROT y en su aplicación puede descifrarlo, el cifrado ROT es simplemente un cambio de caracteres como usar un cambio estándar como 2 una cadena que es "abc" se convierte en "cde" puede usar métodos mucho más complicados sin embargo, depende de la seguridad que necesita. –

4
+0

He intentado algunos, pero ninguno de ellos se relaciona con la configuración del modelo de servicio. – Eaton

3

utilizo el siguiente para cifrar mis cadenas de conexión en web.config, por qué no usar la misma por sí mismo. No estoy seguro sin embargo.

para cifrar:

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" 

ponerlos en archivos BAT para que pueda cifrar o descifrar sobre la marcha.

+0

No son cadenas de conexión, por lo que no funcionaría para esto. – Eaton

2

No es un gran problema si este archivo se modifica /visto ...

En ese caso, lo que es la seguridad para?

Puede cifrar mediante programación secciones de un archivo de configuración con SectionInformation.ProtectSection.

+0

Solo para mantener la URL fuera del alcance del usuario estándar. – Eaton

+0

Simplemente no quiero que sea texto sin formato. – Eaton

+0

SectionInformation.ProtectSection parece ser la solución más fácil, ¿por qué ir con la utilidad aspnet_regiis por separado? – Cahit

0

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();