Kryptere seksjoner i web.config

Sikkerhet er viktig og man kan aldri bli sikker nok. Selv om web.config ikke skal være tilgjengelig så kan det være lurt å gjøre noe med informasjonen i filen. I web.config ligger det ofte sensetive opplysninger (database brukernavn/passord) og disse bør krypteres.

web.config skal ikke være tilgjengelig for eksterne, men tenk deg at noen kommer seg gjennom din ftp-server eller på en annen måte får tilgang til dine filer. Da kan de lese av feks brukernavn/passord til databaser og andre opplysninger som ligger i web.config. Det er så lett å kryptere/dekryptere at det er nesten dumt å ikke gjøre det.

Kryptere web.config med Visual Studio Command Prompt

aspnet_regiis 
  -pef "SectionName" "PathToWebConfig" 
  -prov "Provider"

feks:
aspnet_regiis 
  -pef "connectionStrings" "c:\wwwroot\web\" 
  -prov "RsaProtectedConfigurationProvider"

Sectionname er case-sensitiv!

For å dekryptere skriver du:

aspnet_regiis -pdf "SectionName" "PathToWebConfig" 

feks:
aspnet_regiis -pdf "connectionStrings" "c:\wwwroot\web\"

En vikitg tin er at du kan ikke kryptere web.config på en pc og kopiere filen til en ekstern server eller annen pc. Krypteringen bruker en machine-specific nøkkel. Dersom du må gjøre en kryptering som kan kopieres kan du lese mer på MSDN Specifying a Protected Configuration Provider

Kryptere web.config vha kode

Dersom du bruker et webhotell får du som regel ikke tilgang til commandpromt og trenger derfor en annen løsning. Da kan du feks lage kode i din webapplikasjon som gjør samme jobben. Under ser du kode for å kryptere og dekryptere web.config.

public void EncryptConnString(string sectionName)
{
    string path = Request.ApplicationPath;
    Configuration config = 
        WebConfigurationManager.OpenWebConfiguration(path);
    ConfigurationSection section = config.GetSection(sectionName);
    if ((section != null) && (!section.SectionInformation.IsProtected))
    {
        string providerName = "RsaProtectedConfigurationProvider";
        section.SectionInformation.ProtectSection(providerName);
        config.Save();
    }
}

public void DecryptConnString(string sectionName)
{
    string path = Request.ApplicationPath;
    Configuration config = 
        WebConfigurationManager.OpenWebConfiguration(path);
    ConfigurationSection section = config.GetSection(sectionName);
    if ((section != null) && (section.SectionInformation.IsProtected))
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

Du kan ikke kryptere alle seksjoner. Disse seksjonene kan ikke krypteres helt uten videre: processModel, runtime, mscorlib, startup, system.runtime.remoting, configProtectedData, satelliteassemblies, cryptographySettings, cryptoNameMapping, cryptoClasses

Krypteringsprovidere

RSAProtectedConfigurationProvider: Dette er default provider og bruker RSA Public Key Encryption algorithm til kryptering og dekryptering av data.
DataProtectionConfigurationProvider: Denne provideren bruker Windows Data Protection Application Programming Interface (DPAPI) til kryptering og dekryptering.