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?

Comments (6)
  1. Jag har använt mig av DataProtectionScope.LocalMachine i ett flertal webbapplikationer och jag tycker att det fungerar bra. (Det är relativt enkelt redan idag att använda det idag, men blir lättare i 2.0. Microsoft har en bra How-to-do, vilket visar hur man skall kunna implementera den i Framework 1.)

    Problemet, precis som du beskriver, är att både kryptering och dekryptering måste göras på samma maskin. Om man till exempel vill kryptera sin connectionsträng, så måste det alltså göras på maskinen som skall använda den. Det kan kräva lite mer administration vid produktsättning. Men speciellt svårt är det inte.

  2. Andreas Håkansson says:

    Johan,

    Intressant förslag. Enda problemet jag kan se spontant är att det kan bli problem om man t.ex lastblanaserar, dock är det väl bara att konfigurera machine.config likadant på samtliga maskiner så skall det fungera.

    Förresten, är bloggen på svenska igen ?

  3. Andreas Håkansson says:

    Vid närmare eftertanke så är det blandat mellan inläggen

  4. JohanLindfors says:

    Angående bloggningsspråk så har jag inte bestämt ännu vad jag ska låsa mig för, jag har en kategori på inlägg som heter "På Svenska" som jag taggar alla svenska inlägg med för närvarande.

    Angående lastbalansering så löses det inte genom att konfigurera datorerna på liknande sätt så vitt jag förstått, utan det är mer knutet till datorns domänprofil, men jag måste nog läsa på lite extra där. Det får nog kanske bli ändå att konfigurera komponenten att exekvera som en specifik användare och använda CurrentUser istället som scope… Men det kontot måste isåfall skyddas, med ett avancerat lösenord!

  5. Andreas Håkansson says:

    Fel av mig ang. ändring i machine.config, tänkte på en helt annan sak. Jag skulel vilja påpeka till eventuella läsare att trots problem vid lastbalansering så är detta fortfarande en intressant metod för att säkra information för väldigt många typer av applikationer, där ibland även ASP.NET.

    Väldigt många sidor klarar sig väldigt bra utan att lastbalansera och ändå kunna hantera en stor mängd förfrågningar.

    Vistt bör man göra en analys och försöka förutspå om man kan tänkas behöva skala ut vid ett senare tillfälle, men som sagt väldigt många sidor kommer aldrig behöva det behovet och är då perfekta kandidater till detta extra skydd.

    PS. Är det bara jag som har problem med att "Remember Me?" funktionen inte fungerar som den skall ?

  6. Andreas Håkansson says:

    En sak till som nyss slog mig. Visst blir det problem om man använder denna lösningen även på icke lastbalanserade applikationen om man måste byta ut servern man kör på?

Comments are closed.

Skip to main content