Hash eines Passworts erstellen

Kaum eine Anwendung kommt heute noch ohne Passwort aus. Aufgrund dieser Tatsache verwenden Benutzer häufig einfache Passwörter, oder schlimmer noch - für jede Anwendung das gleiche Passwort. Umso wichtiger ist es das die Entwickler der Anwendung die Passwörter der Benutzer schützen, und das so gut wie möglich.

Damit Angreifer bei einer Komprimitierung der Datenbank nicht alle verwendeten Passwörter im Klartext vor sich haben, empfiehlt es sich ein Hash des Passworts zu erstellen und diesen in Verbindung mit einem Zufallswert (genannt Salt) in der Datenbank zu speichern.

Seit der Version 2.0 des .NET Frameworks steht die Klasse Rfc2898DerivedBytes zur Verfügung, welche auf dem Passwort-Hashing-Standard RFC2898 basiert.

Zunächst muss der Zufallswert (Salt) erstellt werden. In diesem Beispiel wird eine 16 byte lange Zufallszahl erstellt. Denkbar wäre jedoch auch eine Verwendung des Benutzernames, oder eines anderen eindeutigen Wertes.

byte[] GetSalt(int length)
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[length];
    rng.GetBytes(buff);

    return buff;
}

In Verbindung mit dem Salt kann nun der Passwort Hash erstellt werden.

byte[] GetHashPassword(string password, byte[] salt)
{
    Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, salt, 10000);
    return rfc.GetBytes(16);
}

Die zurückgegeben Werte müssen, bevor Sie in der Datenbank gespeichert werden können, in einen Base64 String umgewandelt werden.

Bei der Anmeldung eines Users wird das eingegebene Passwort mit dem in der Datenbank gespeicherten Salt in einen Hash umgewandelt und mit dem Hash in der Datenbank verglichen. Bei Erfolg kann die Anmeldung fortgesetzt werden.

Das Beispielprojekt als Konsolenanwendung kann hier runtergeladen werden.

  1. No Comments