Programkod för säkrare lösenordslagring

När man bygger en webbtjänst är det inte så listigt att spara lösenord i klartext i databasen utifall att någon lyckas komma över informationen antingen lokalt via servern eller genom SQL injection.
Det räcker inte heller att omvandla informationen enligt den vanliga så kallade hashningen MD5 eftersom det är ganska enkelt att kolla vilka som har lösenordet password exempelvis genom att använda Google.

Det som MD5 gör är att omvandla en textsnutt till något annat, dock ger samma textsnutt samma resultat varje gång vilket gör att man ska göra något som kallas för att salta. MD5 går dock inte att avkryptera så om man saltar och lyckas hålla saltet hemligt så blir lösenorden rätt säkert lagrade.

Exempelkod i C#:

public static string HashString(string password, string username) {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        string inData = password + username + "DEtHÄRÄRSALTET"; //här läggs saltet på
        byte[] data = System.Text.Encoding.UTF32.GetBytes(inData);
        data = x.ComputeHash(data);
        string ret = string.Empty;
        for (int i = 0; i < data.Length; i++)
            ret += data[i].ToString("x2").ToLower();
        return ret;
    }

Anropa genom att skriva:
string braLosenord = HashString(Password.Text, Userid.Text); //Detta är fält som anropas från ett formulär

Ska du nörda dig ännu mera kan du anropa funktionen HashString() med mer än bara lösenordet, exempelvis annan information om användaren, exempelvis:
string braLosenord = HashString(Password.Text + DateTime.Now.ToString() + Username.Text);

Värt att tänka på är dock att denna information måste finnas tillgänglig när systemet kontrollerar att användaren använder rätt inloggningsuppgifter. Dessutom är det en god idé att inte låta felmeddelanden med källkoden synas på sajten, då ger man hackaren onödiga fördelar. Detta går att stänga av i web.config i webbapplikationer med ASP.NET