C# User Login: Passwort-Hash vergleichen?
Hallo,
ich programmiere eine Anwendung, in der man Adressen mit SQL-Server verwalten kann. Man kann Benutzer anlegen und sich mit denen beim Start der Anwendung einloggen.
Nun möchte ich das Passwort hashen. Beim Erstellen des Benutzers wird bereits ein Hashwert generiert und in der Passwort-Spalte in der Datenbank angezeigt. Beim Einloggen soll auch das Passwort gehasht werden und dann der Hash vom Einloggen mit dem aus der Datenbank auf Übereinstimmung verglichen werden.
Ich habe mich an folgendem Tutorial orientiert: https://dotnetcodr.com/2017/10/26/how-to-hash-passwords-with-a-salt-in-net-2/
Ich generiere also immer einen zufälligen Hashwert und das auch beim Einloggen. Wenn ich dann also den Hash vom Einloggen mit dem aus der Datenbank pvergleiche, können die nie übereinstimmen, weil eben bei beiden immer ein zufälliger Wert generiert wird.
Hash (beim Erstellen des Benutzers):
public HashWithSaltResult HashWithGenericSalt(string password, int saltLength, HashAlgorithm hashAlgo)
{
RNG rng = new RNG();
byte[] saltBytes = rng.GenerateRandomCryptographicBytes(saltLength);
byte[] passwordAsBytes = Encoding.UTF8.GetBytes(password);
List<byte> passwordWithSaltBytes = new List<byte>();
passwordWithSaltBytes.AddRange(saltBytes);
passwordWithSaltBytes.AddRange(passwordAsBytes);
byte[] digestBytes = hashAlgo.ComputeHash(passwordWithSaltBytes.ToArray());
return new HashWithSaltResult(Convert.ToBase64String(saltBytes), Convert.ToBase64String(digestBytes));
}
Hash (beim Einloggen):
public HashWithSaltResult HashWithSalt(string password, string salt, HashAlgorithm hashAlgo)
{
// Wie hashe ich beim einloggen?
}
Einloggen:
using (var context = new PersonDbContext())
{
var query = from p in context.Benutzers where textBoxVorname.Text == p.Vorname && textBoxName.Text == p.Name && HashResultSha512.Digest == p.PasswortDigest select p;
HashPassword();
}
public void HashPassword()
{
PasswordWithSaltHasher pwHasher = new PasswordWithSaltHasher();
HashResultSha512 = pwHasher.HashWithSalt();
db.CheckBenutzerLogin(textBoxVorname.Text, textBoxPasswort.Text, HashResultSha512.Salt, HashResultSha512.Digest);
}
Was muss ich in
public HashWithSaltResult HashWithSalt
schreiben, damit er den Hashwert aus der Datenbank verwendet und nicht wieder einen neuen Wert generiert?
2 Antworten
Beim Einloggen verwendest du nicht die HashWithSalt Methode. Du musst dir dazu noch eine eigene Methode schreiben um das zu prüfen.
Einfach an das Passwort den Salt anhängen dann den Hash bilden und selbst mit der DB vergleich ob es überein stimmt.
Du darfst doch nicht zwei unterschiedliche Ausgangswörter nehmen.
Hashfunktionen sind Einwegfunktionen. Du hasht dein Passwort am Anfang und legst es in der Datenbank ab. Und beim Einloggen musst du natürlich exakt die gleiche Hashfunktion nutzen. Und zwar ungesalzen! Braucht man da nämlich nicht.
Sofort in dem OnEinloggenKlickiBuntiEvent sofort den Hash erzeugen und zur Datenbank zu Vergleich schicken.
Mehr brauchst du nicht zu tun. Salzen ist nicht nötig, da man Hash-Werte eh nicht auf den Ursprung zurückführen kann.