Autor Beitrag
cam
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 02.10.08 16:35 
Hallo,

ich möchte eine Login-Abfrage machen.
Die Verbindung zur Datenbank steht und das Passwort wird auch gefunden, aber wie kann ich nun das gefundene Passwort mit dem in der Textbox vergleichen?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
if (dt.Rows.Count > 0)
{
    foreach (DataRow row in dt.Rows)
    {
          if (password.Text.Equals(dt.Rows[0][0]))
          {
              MessageBox.Show("Anmeldung erfolgreich!");
          }
          else
          {
              MessageBox.Show("Fehler bei Anmeldung!");
          }
    }
}


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 02.10.08 18:05 
Naja, wenn Du das unbedingt so prüfen willst, dann geht das doch ganz einfach:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
if (dt.Rows.Count > 0)
{
    foreach (DataRow row in dt.Rows)
    {
          if (password.Text = (string)row[0] )
          {
              MessageBox.Show("Anmeldung erfolgreich!");
              break;
          }
          else
          {
              MessageBox.Show("Fehler bei Anmeldung!");
          }
    }
}

Zur Erläuterung: Mit der foreach-Schleife gehst Du alle Zeilen durch. Mit row[0] holst Du den Wert der Spalte 0. Dies ist (vermutlich immer) als String zu interpretieren, also so zu casten. Dann geht der direkte String-Vergleich. Wenn der Vergleich OK ist, dann muss die Schleife abgebrochen werden; sonst ist das Login nicht erfolgreich, wenn der letzte Datensatz nicht passt.

Diese Art der Prüfung ist aber sowieso nicht gut: In einer Datenbank (egal wo und wie) sollte niemals ein Passwort gespeichert sein, sondern immer nur ein Hash-Wert. Aus dem eingegebenen Passwort ist nach der gleichen Regel der Hash-Wert zu berechnen; nur dieser ist zu vergleichen. Wenn der Benutzername eingegeben ist, dann kann in der Login-Datenbank direkt nach diesem Namen gesucht werden; also bekommst Du sowieso genau eine Zeile für die Ergebnisprüfung.

Gruß Jürgen
cam Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 02.10.08 19:23 
Danke für die Erklärungen.
So wie du mir das aufgeschrieben hast, funktioniert es auch nicht :(

Könntest du mir denn evtl. einen Link geben oder zeigen, wie das mit den Hash-Werten geht?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 03.10.08 10:46 
user profile iconcam hat folgendes geschrieben Zum zitierten Posting springen:
So wie du mir das aufgeschrieben hast, funktioniert es auch nicht :(

"funktioniert nicht" ist keine richtige Beschreibung: Wird ein Benutzer ohne richtiges Passwort akzeptiert, wird ein Benutzer trotz Passwort abgewiesen, wird die Schleife überhaupt nicht durchlaufen, oder was?

Außerdem verweigerst Du uns sämtliche Informationen darüber, woher dt.Rows kommen und wie sie aufgebaut sind. Erst dann ist eine genauere Antwort möglich.

Passwort-Verschlüsselung mit Hash
user profile iconcam hat folgendes geschrieben Zum zitierten Posting springen:
Könntest du mir denn evtl. einen Link geben oder zeigen, wie das mit den Hash-Werten geht?

Nicht viel anders als mit einem "echten" Passwort: Der eingegebene Passwort-String wird als Hash-Wert verschlüsselt; zum eingegebenen Benutzernamen wird der Eintrag in der Login-DB gesucht; wenn die Werte gleich sind => Login; andernfalls => Cancel. Wenn der Benutzer sein Passwort ändert, wird es ebenfalls verschlüsselt und dieser Wert gespeichert. Vorteile: Außerhalb des Login-Formulars wird niemals das richtige Passwort verwendet; die Verschlüsselung ist nur in eine Richtung nötig.

Für das Verschlüsseln benutze ich die folgende Routine:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
using System.Security.Cryptography;
using System.Text;

string passwordValue = GetMD5Hash(editPassword.Text + editUsername.Text);

/// <summary>
/// GetMD5Hash converts an input string to a MD5 hash using standard
/// classes and methods of the .NET framework.
/// <para>This method combines the full class name, the original password,
/// and the complete user's name.</para>
/// <para>If you want to use another hashing or encrypting method,
/// you must set usingHash=false<see cref="useHash"/> in the SetEvents()
/// method and include the procedure in your own LoginEvent methods.</para>
/// <para>Note: It is more secure if the original password is not visible
/// outside of the login form. Therefore I recommend to use the
/// standard hashing.</para>
/// </summary>
/// <param name="Input">The given string that has to be encrypted</param>
/// <returns>The encrypted string</returns>
string GetMD5Hash(string Input) {
  UnicodeEncoding enc = new UnicodeEncoding();
  byte[] input = enc.GetBytes(enc.GetType().FullName + Input);
  //  create the Hash string
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] value = md5.ComputeHash(input);
  //  create the return value
  return System.Convert.ToBase64String(value);
}

Diese Methode gehört zu einem "eigenen" Login-Form, das aber noch nicht so gut durchdacht ist, dass ich es auf CodeProject veröffentlichen wollte. - Ein Hash-Wert ist um so sicherer, je länger der Input-String ist; deshalb verknüpfe ich ihn mit dem Klassennamen.

Jürgen
cam Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 03.10.08 12:43 
Danke für deine Hilfe. Ich habe das Problem gefunden. Das Passwort konnte nicht verglichen werden, weil aus der Datenbank die Leerzeichen, die nicht für das Passwort benötigt wurden, mit übernommen wurden und somit ist ja "xyz" != "xyz ".

Und die Verschlüsselung werde ich probieren, also vielen Dank noch mal :)
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 03.10.08 13:30 
Wegen dieses "Fehlers" habe ich den Verdacht, dass das Textfeld als CHAR deklariert wurde, aber nicht als VARCHAR. Du musst also offensichtlich bei der Verarbeitung unter NET immer String.Trim benutzen. Jürgen
cam Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 03.10.08 14:07 
Genau :)