Laden...

Verschlüsselungsalogorhytmus in C# für ein WebProjekt

Erstellt von BK01 vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.974 Views
B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 18 Jahren
Verschlüsselungsalogorhytmus in C# für ein WebProjekt

Hallo zusammen,

ich möchte Passwörter in einer MS SQL Datenbank speichern, damit sich Benutzer in meiner Web - Anwendung anmelden können.

Ich möchte allerdings die Passwörter nicht im Klartext speichern...

Kann mir jemand nen Codebeispiel zeigen, oder woher ich sowas bekommen?

1.696 Beiträge seit 2006
vor 18 Jahren

hi, such mal nach md5

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

S
8.746 Beiträge seit 2005
vor 18 Jahren

Md5 wäre der klassische Weg, wobei anzumerken ist, dass es sich hierbier nicht um Verschlüsselung handelt. Bei einer Verschlüsselung sind die Originaldaten durch eine Entschlüsselung vollständig wiederherstellbar. Md5 bildet nur eine Hashsumme (so etwas wie eine fast eindeutige Quersumme). Bei Md5-Verwendung wird das Passwort also "verhasht" und der Hashwert in der DB abgelegt. Bei der erneuten Eingabe werden nur noch die Hashwerte verglichen.

Dieses Verfahren ist deutlich einfacher als "echte Verschlüsselung" und erfordert kein Geheimpasswort (das macht dieses Verfahren sehr sicher), da es sich um einen Einweg-Algorithmus handelt.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo zusammen,

ich wollte nur Anmerken, dass es ein MD5-Verfahren bei einem Passwortschutz sogar ermöglicht, dass kein Admin der Welt Deine Passwörter rekonstruiren kann.

Das halte ich ebenfalls für sehr wichtig bei der Passwortspeicherung. Ein Admin kann es dann bei Bedarf auf einen von Ihm ausgewählten Initialwert zurücksetzen (genauer: überschreiben).

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 18 Jahren

Das klingt ja nicht schlecht.

Ich werde mal danach googeln... Oder hat jmd. vll. schon fertigen Code davon?
Wie funktioniert das mit dem zurücksetzen denn genau? Weil es schon blöd wäre, wenn man sein PW vergisst und das nicht ändern kann... (als Admin)

Ich habe auch ne PW ändern funktion die halt die Werte altes PW + 2 mal neues PW braucht... Da sollte das auch gehen?!

Gruß
BK

J
20 Beiträge seit 2006
vor 18 Jahren

Naja, das mit dem Zurücksetzen ist kein Problem.
Da der MD5-Hashwert in der Datenbank bespeichert wird,
generierst Du beim Passwort ändern einfach den neuen Hashwert mittels des MD5 Algorithmus und machst ein UPDATE auf die Datenbank.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo BK01,

zurücksetzen, dass ein alter Wert drinsteht, das geht nicht. Sorry, wenn ich das falsch verständlich formuliert habe. Was ich meine, ist, dass ein Admin ein Passwort vorgeben kann, das benutzt wird, um das aktuelle zu überschreiben.

Das hieße dann in einem konkreten Beispiel formuliert:

User1 hat den Usernamen 'U1' und sein Passwort Klartext 'test' gewählt. Das könnte nach einer MD5 Umwaqndlung z.B. so aussehen: 'F4bST1'.

Jetzt hat User1 sein Passwort vergessen. Da auch der Admin nur 'F4bST1' sehen kann, kann er kein Passwort ermitteln. Also muss er hier ein Passwort belibiebig festsetzen, und überschreibt das alte. Z.B. wählt der Admin das PW: 'bitteaendern' und das ergibt dann wieder durch MD5 z.B. 'dlo3P?2da'. Also kann sich User1 jetzt mit diesem PW sich wieder anmelden, und ggf. dieses PW wieder auf eines seines Wunsches ändern.

Somit ist dem Admin aber halt nicht die Möglichkeit gegeben, Klartextpasswörter zu lesen, die bei dem User vielleicht noch wo anders gelten könnten (viele benutzen ja nur ein PW!).

Wenn Du als Admin Dein PW vergisst, dann kannst Du Dir ja standardmäßig die Funktion einbauen, dass es Dir auf 'bitteaendern' -> 'dlo3P?2da' setzt, sobald Du ein externes Programm dafür ausführst...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
8.746 Beiträge seit 2005
vor 18 Jahren

Original von BK01
Das klingt ja nicht schlecht.

Ich werde mal danach googeln... Oder hat jmd. vll. schon fertigen Code davon?

BK

Wir nicht, aber Studio bring in der Hilfe Code mit. Gibt mal Md5 ein.

Hier mal ein kleines Beispiel. Die Daten müssen als Byte-Array vorliegen.

 
byte[] data = new byte[DATA_SIZE];
// This is one implementation of the abstract class MD5.
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(data);

Aber: Md5 ist nur so sicher wie die Eingangsdaten. Angenommen dein PW besteht nur aus einem Zeichen (Ascii), dann hast du eben auch nur 256 verschiedenen Hashwerte.

Deswegen gibt es PW-Algorithmen, die die Eingangsdaten auf eine größere Länge auffüllen um so die Zahl der möglichen Ergebnisse zu erhöhen. Man nennt diese zusätzliche Passwort-Extension "salt". Der Salt muss mit dem Hash in der DB gespeichert werden und nach der Eingabe durch den Nutzer durch die Applikartion ergänzt werden, bevor der Hash berechnet wird. Typisch ist der Verwendung einer GUID oder ein zufällig generierter String (bekommst du über RNGCryptoServiceProvider).

Pur-MD5 bei klassischer PW-Länge ist definitiv mit Brute Force knackbar. Gibt einen kommerziellen Dienst der das tut. Ein PW aus 8 Zeichen braucht nur 2 Stunden.

1.696 Beiträge seit 2006
vor 18 Jahren

Original von norman_timo
Jetzt hat User1 sein Passwort vergessen. Da auch der Admin nur 'F4bST1' sehen kann, kann er kein Passwort ermitteln. Also muss er hier ein Passwort belibiebig festsetzen, und überschreibt das alte. Z.B. wählt der Admin das PW: 'bitteaendern' und das ergibt dann wieder durch MD5 z.B. 'dlo3P?2da'. Also kann sich User1 jetzt mit diesem PW sich wieder anmelden, und ggf. dieses PW wieder auf eines seines Wunsches ändern.

Somit ist dem Admin aber halt nicht die Möglichkeit gegeben, Klartextpasswörter zu lesen, die bei dem User vielleicht noch wo anders gelten könnten (viele benutzen ja nur ein PW!).

Wenn Du als Admin Dein PW vergisst, dann kannst Du Dir ja standardmäßig die Funktion einbauen, dass es Dir auf 'bitteaendern' -> 'dlo3P?2da' setzt, sobald Du ein externes Programm dafür ausführst...

die Vorbelegung eines Default-PWs ist nicht zu empfehlen, da man sehr schnell knacken kann.

Besser:

  • User vergisst PW und klickt auf PW-Anforderung
  • eine Maske geht auf, User muss Loginname und Email eingeben
  • Beide Eingaben werden gegen Daten in der DB überprüft, stimmen beide mit den DBDaten überein, wird ein PW generiert, MD5 verschlüsselt, zusammen mit einer Frist in die DB abgelegt und anschliessend an dem User versendet. Stimmt einer der Eingabe nicht, wird die Maske wieder angezeigt. Nach 5 mal dann 1 Stunde Sperre, nach weitere 5 dann 2 Stunden usw.
  • User bekommt Mail, muss sich innerhalb einer Frist wieder einloggen, dabei das erhaltene PW eingeben. Ist die Frist abgelaufen, musst er erneut anfordern, da beim Einloggen dies auch geprüft wird.
  • nachdem reloggin, erscheint ein Fenster mit der Aufforderung das PW zu ändern, dabei muss das erhaltene PW nochmals eingegeben werden.

Ist schon kompliziert, aber sicherer.

HTH

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 18 Jahren

Yo, vielen Dank!

Ich werde es nicht ganz so krass machen, wie du "vbprogger" es vorschlägst. Es ist vll die sicherere Methode, allerdings ist der Aufwand im ersten Schritt zu hoch....

Ich setz es erstmal so um, dass man keinen Klartext mehr speichert. Dann erweitere ich es Stück für Stück...

Erst krabbeln, dann gehen 😉 Und ich krabbel noch in C# ...

Aber allen erst mal ein herzliches Dankeschön!!! 👍

Gruß
BK