Teknikdags: Lagra användarnamn och "hashade" lösenord.

Vi har alldeles nyss inlett utvecklingen av den demo-applikation (som tidigare kallades referens-applikation, vilket är fel) som vi avser att använda under seminarier, webbsändningar och tekniska artiklar i framtiden. Jag har redan funderat en del på arkitekturen tillsammans med några av mina kollegor och vi siktar på att använda vår referensarkitetktur "enligt boken" för att skapa en flexibel arkitektur som ger oss så stora möjligheter som möjligt att gå vidare i olika scenarios.

Det som jag också försökt att inleda är implementationen av en skräddarsydd MembershipProvider för ASP.NET 2.0, skälet till att jag valt en egen och inte ASP.NET's inbyggda är att den inbyggda genererar väldigt många tabeller som vi initiellt inte behöver (rollhantering, personifiering) utan vi vill försöka att hålla den första implementationen så pass enkel så att det är lätt att sätta sig in i den för att sedan kunna fokusera på detaljer för vidareutveckling.

Den MembershipProvider som jag skapat ligger nu i presentations-skiktet och gör uppslag och uppdateringar genom arkitekturen, eventuellt så kan vi tillåta läsningar direkt från presentations-skiktet till dataskiktet. Jag har också valt att skapa en komponent (klass) i mellanskiktet där logiken ligger för att validera och skapa användarna, denna komponent gör sedan uppslag och uppdateringar mot databasen. Det finns massvis med frågor och alternativ och det är där som jag hoppas att diskussionen kan inledas när vi släpper den första versionen senare.

Sättet som jag lagrar användaruppgifterna på i databasen är genom att enbart lagra "hashade" lösenord, och då även saltade sådana. Den metod som jag använder ser ut enligt följande:

private static string HashPassword(string password, ref string passwordSalt)

 
 {
     Rfc2898DeriveBytes db = new Rfc2898DeriveBytes(password, 32, 1000);
     
     if (passwordSalt == null)
         passwordSalt = Convert.ToBase64String(db.Salt);
     else
         db.Salt = Convert.FromBase64String(passwordSalt);
  
     byte[] passwordHash = db.GetBytes(32);
     return Convert.ToBase64String(passwordHash);
 }

Den här metoden använder .NET Framework 2.0's inbyggda klasser och ramverk för att returnera ett saltat och "hashat" lösenord som antingen kan lagras i databasen alternativt jämföras med det som redan finns lagrat sedan tidigare.

Hur gör du för att lagra dina lösenord, vilken metod passar dig?