2011-06-03 17 views
32

ASP.NET 4Cómo cifrar una entrada en web.config

He usado RSA key encryption de cadenas de conexión en web.config en mi granja de servidores web. Sin embargo, hay una entrada de contraseña personalizada que me gustaría encriptar. ¿Cómo debo encriptarlo con la clave RSA sin tener cifradas las configuraciones restantes? por favor asesóreme, gracias.

Ejemplo:

<appSettings> 
     ... 
    <add key="Host" value="www.foo.com" /> 
    <add key="Token" value="qwerqwre" /> 
    <add key="AccountId" value="123" /> 
    <add key="DepartmentId" value="456" /> 
    <add key="Password" value="asdfasdf" /> 
    <add key="SessionEmail" value="[email protected]" /> 
    <add key="DefaultFolder" value="789" /> 
    </appSettings> 

Respuesta

53

Puede poner la contraseña en una sección separada y encriptar solo esta sección. Por ejemplo:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="secureAppSettings" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <appSettings> 
     <add key="Host" value="www.foo.com" /> 
     <add key="Token" value="qwerqwre" /> 
     <add key="AccountId" value="123" /> 
     <add key="DepartmentId" value="456" /> 
     <add key="SessionEmail" value="[email protected]" /> 
     <add key="DefaultFolder" value="789" /> 
    </appSettings> 

    <secureAppSettings> 
     <add key="Password" value="asdfasdf" /> 
    </secureAppSettings> 
</configuration> 

y luego (en cuenta que yo estoy usando DPAPI en mi ejemplo para adaptar al proveedor por RSA):

aspnet_regiis -pef secureAppSettings . -prov DataProtectionConfigurationProvider 

Una vez que cifró el archivo se vería así:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="secureAppSettings" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <appSettings> 
     <add key="Host" value="www.foo.com" /> 
     <add key="Token" value="qwerqwre" /> 
     <add key="AccountId" value="123" /> 
     <add key="DepartmentId" value="456" /> 
     <add key="SessionEmail" value="[email protected]" /> 
     <add key="DefaultFolder" value="789" /> 
    </appSettings> 

    <secureAppSettings configProtectionProvider="DataProtectionConfigurationProvider"> 
     <EncryptedData> 
      <CipherData> 
       <CipherValue>AQAAANCMnd.......</CipherValue> 
      </CipherData> 
     </EncryptedData> 
    </secureAppSettings> 
</configuration> 

La forma en que accederá a esa configuración en su aplicación una vez que el archivo está encriptado sigue siendo la misma y completamente transparente:

var host = ConfigurationManager.AppSettings["Host"]; 
var password = ConfigurationManager.AppSettings["Password"]; 
+1

¿Cómo es que no es ConfigurationManager.secureAppSettings ["Password"]? ¿Qué hace que .NET pueda tratar esa sección de secureAppSettings como parte de appSettings? – Stan

+3

@Stan, usa un 'NameValueSectionHandler'. –

+2

No puedo recuperar el valor de "Contraseña" en la sección "secureAppSettings" usando "ConfigurationManager.AppSettings [" Password "];" en el sitio web .net 3.5 asp.net. – nRk

8

No se puede cifrar una sola entrada - la infraestructura sólo permite el cifrado de las secciones de configuración enteros.

Una opción es colocar la entrada en su propia sección de configuración y encriptar eso.

+0

¿Sabe si es posible encriptar una subsección? http://stackoverflow.com/questions/34504301/encrypt-a-subsection-of-web-config – TTT

+0

Esto no es cierto: https://blogs.msdn.microsoft.com/gaurav/2013/12/15/encrypting -section-of-config-file-using-aspnet_regiis-exe-the-configuration-for-physical-path-web-config-can-be-opened/ –

+1

@RyanMendoza - necesita leer ese artículo nuevamente. No se puede encriptar una sola entrada de ** nodo **, o simple **, toda la sección necesita ser encriptada. – Oded

9

en C# y .Net 4.5, tuve que usar esto para leer la configuración de cifrado:

string password = ((System.Collections.Specialized.NameValueCollection)ConfigurationManager.GetSection("secureAppSettings"))["Password"].ToString(); 

pero por lo demás funciona un convite.