Visual Studio – die besten Beiträge

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?

SQL, programmieren, Passwort, Login, C Sharp, SQL-Server, Visual Studio

C# Abbrechen-Button?

Hallo, ich habe ein Problem mit meiner Anwendung. Ich habe eine Form die heißt z.B. Form1 und eine Form2. Beim klick auf den Hinzufügen-Button in Form1 öffnet sich Form2 (dort sollen dann Daten in Textboxen eingegeben). Wenn ich dann auf den Speichern-Button klicke werden diese eingegebenen Daten in eine Datenbank gespeichert und in einem Datagridview in Form1 angezeigt. Das Problem hierbei ist, der Abbrechen-Button in Form2 funktioniert nicht (beim klick auf den Abbrechen-Button soll man wieder zurück zu Form1 kommen). Ich habe eine Datenbank Kontext Klasse "PersonDbContext" in der zwei Methoden sind, einmal zum hinzufügen und einmal entfernen einer Person aus dem grid sowie Datenbank.

DbContext:

public class PersonDbContext : DbContext
	{
		public DbSet<Persons> Person { get; set; }
    public void AddPerson(Persons person)
    {
        Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

    public void RemovePerson(Persons person)
    {
        Person.Attach(person);
        Entry(person).State = EntityState.Deleted;
        SaveChanges();

        MessageBox.Show(@"Person wurde erfolgreich gelöscht.");
    }
}

Form1:

private void buttonHinzufügen_Click(object sender, EventArgs e)
		{
			var dlg = new PersonDialog();
			dlg.ShowDialog();
			var person = dlg.Persons;
        _db.AddPerson(person);
        _db.SaveChanges();
    }

PersonDialog ist die 2. Form die sich dann öffnet (Form2).

Wenn ich auf meinen Abbrechen-Button in meiner 2. Form klicke bekomme ich immer den Fehler das der Wert nicht null sein darf.

Also im DbContext in der AddPerson-Methode heißt es dann der Wert darf nicht null sein (bei Person.Add(person);

public void AddPerson(Persons person)
		{
            //Wert darf nicht null sein.
    		Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

Wenn ich aber eben keine Person hinzufügen will (keine Daten in Form2 eingeben will) ist es null. Ich muss sogesehen eine neue Person hinzufügen und die dann per Löschen-Button in Form1 wieder entfernen weil ich sonst ja die Exception kriege. Also wie bringe ich den Abbrechen-Button in Form2 zum laufen (damit es egal ist ob der Wert null ist bzw halt nichts eingegeben wurde)?

Danke euch. :)

Computer, SQL, programmieren, C Sharp, Datenbank, Visual Studio

C# - Ungültige Zeichenabstände und ungültige Länge der Daten?

Hallo, ich habe eine Xml-Datei, welche einen Benutzernamen sowie Passwort enthalt und eine Xml-Datei, welche auch einen Benutzernamen und Passwort enthält, nur ist dort das Passwort verschlüsselt.

Wenn ich die erstgenannte Xml-Datei öffne (Passwort nicht verschlüsselt) kommt der Fehler:

"System.Security.Cryptography.CryptographicException: Zeichenabstände sind ungültig und können nicht entfernt werden."

Wenn ich die andere Xml-Dazei öffne (Passwort verschlüsselt) kommt der Fehler:

"System.Security.Cryptography.CryptographicException: Die Länge der zu entschlüsselnden Daten ist ungültig."

Code zum entschlüsseln der Datei:

byte[] chiperbytes = File.ReadAllBytes(path);
                MemoryStream ms1 = new MemoryStream(chiperbytes);
                CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read);

                cs1.Read(chiperbytes, 0, chiperbytes.Length);
                plainbytes2 = ms1.ToArray();


                cs1.Close();
                ms1.Close();
                textBoxPasswort.Text = Encoding.ASCII.GetString(plainbytes2);

Code zum verschlüsseln:

cipherData = textBoxVerschlüsselung.Text;
					plainbytes = Encoding.ASCII.GetBytes(cipherData);
					plainKey = Encoding.ASCII.GetBytes("01234567890abcdef");
					desObj.Mode = CipherMode.CBC;
					desObj.Padding = PaddingMode.PKCS7;
					MemoryStream ms = new MemoryStream();
					CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write);
					cs.Write(plainbytes, 0, plainbytes.Length);
					cs.Close();
					chiperbytes = ms.ToArray();
					ms.Close();
                textBoxVerschlüsselung.Text = Encoding.ASCII.GetString(chiperbytes);

Bitte helft einem Anfänger. :D

Danke.

Technik, programmieren, C Sharp, Technologie, Visual Studio

Meistgelesene Beiträge zum Thema Visual Studio