web-dev-qa-db-fra.com

Comment crypter une entrée dans web.config

ASP.NET 4

J'ai utilisé chiffrement par clé RSA pour les chaînes de connexion dans web.config sur ma batterie de serveurs Web. Cependant, il y a une autre entrée de mot de passe personnalisée que je voudrais crypter. Comment dois-je le chiffrer avec la clé RSA sans que les autres configurations soient chiffrées. S'il vous plaît conseiller, merci.

Exemple:

  <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>
41
Stan

Vous pouvez mettre le mot de passe dans une section distincte et crypter cette section uniquement. Par exemple:

<?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>

puis (notez que j'utilise DPAPI dans mon exemple donc adaptez le fournisseur pour RSA):

aspnet_regiis -pef secureAppSettings . -prov DataProtectionConfigurationProvider

Une fois crypté, le fichier ressemblera à ceci:

<?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 façon dont vous accéderiez à ces paramètres dans votre application une fois le fichier chiffré est toujours la même et complètement transparente:

var Host = ConfigurationManager.AppSettings["Host"];
var password = ConfigurationManager.AppSettings["Password"];
61
Darin Dimitrov

En c # et .Net 4.5, j'ai dû utiliser ceci pour lire le paramètre crypté:

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

mais fonctionne autrement un régal.

12
user2993145

Vous ne pouvez pas crypter une seule entrée - l'infrastructure ne permet que le cryptage de sections de configuration entières.

Une option consiste à placer l'entrée dans sa propre section de configuration et à la crypter.

8
Oded