DataProtection API i .NET Framework 2.0

Hade några diskussioner med utvecklare under veckans MSDN Workshop angående Data Protection API'et och hur det egentligen skulle kunna användas. DPAPI som i och med .NET Framework 2.0 finns implementerat i ramverket kan användas för att symmetriskt kryptera information utan att behöva använda sig av nycklar. Naturligtvis så används nycklar bakom kulisserna men du som användare eller utvecklare behöver inte bry dig om det som vanligtvis är en sårbarhet i symmetrisk kryptering, nämligen distribueringen och synkronisering av nycklar. Istället genereras den symmetriska nyckeln vid kryptering eller dekrypteringstillfället baserat på antingen användarens profil (om vi använder det som kallas DataProtectionScope.CurrentUser) eller den lokala datorns profil (om vi istället använder DataProtectionScope.LocalMachine).

Fördelen med DataProtectionScope.CurrentUser är att profilen för användaren som används kan i en ActiveDirectory domän "roama" över nätverket och alltså erbjuda symmetrisk kryptering oavsett vilken dator som användaren sitter på. Nackdelen är dock att om någon hackar användarens konto så kan också information nås relativt enkelt.

Fördelen med DataProtectionScope.LocalMachine är att vi kan kryptera information på datorn som sedan inte kan flyttas därifrån. Nackdelen är att samma genererade nyckel kommer att användas för all kryptering på den datorn. Nu går det visserligen att också tillföra en entropi vilket kan hjälpa till att särskilja generering av nycklar från applikationer eller användare.

Nu till det som jag tog upp till diskussion:

Jag tror det finns en stor möjlighet att använda DataProtectionScope.LocalMachine i webbsammanhang, exempelvis där vi väljer att lagra information krytperat i databaser och liknande, lek med tanken att skapa en komponent på applikationsservern som sköter krypteringen och dekrypteringen åt oss och gör det baserat på applikationsserverns profil, för att sedan lagra det krypterade resultatet i en databas på en annan server. För att någon ska kunna knäcka den lagrade informationen i databasen så måste dekrypteringen ske på applikationsservern. Jag tycker det verkar vara ett intressant sätt att införa ytterligare ett skikt av säkerhet i applikationer som kräver det.

Tillägg: Efter en kommentar av Andreas Håkansson så verkar det ganska tydligt att ovanstående lösning inte skulle kunna funger i ett lastbalanserat scenario, trist, då blir det att använda UserScope istället där vi har möjlighet att i COM+ sätta vilken profil som komponenten ska exekvera som.

Vad tycker ni?