Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Online Benutzer Authentifizierung


rotalever
2008-06-01, 13:17:52
Hab schon das halbe Netz durchsucht, aber immer nur einfache Authentifizierungssysteme gefunden, die in etwa so funktionieren:
(z.b. http://www.php-mysql-tutorial.com/user-authentication/database.php )
Benutzername und Klartext oder Hash (wohl besser..) des Passworts sind in einer Datenbank auf dem Server gespeichert.
Der Benutzer sendet seinen Benutzernamen und sein Passwort an den Server, dort wird es gehashed und mit der Datenbank verglichen. Stimmt beides überein, so ist der Benutzer akzeptiert. Dies wird durche eine Session-Variable gespeichert, also einfach eine Session erzeugt und "logged in" oder ähnliches reingeschrieben.
Wenn der Benutzer sich ausloggt, wird diese Session wieder gelöscht.
Das kommt mir irgendwie nicht so sehr sicher vor? Muss man nicht noch darauf achten, dass die Session-id möglichst zufällig aus einem großen Wertebereich stammt, damit sie nicht so leicht ausgetested und somit "gehijacked" werden können? Oder erledigt das z.B. PHP automatisch? Wie würde man das sonst realisieren? Eine Zufallszahl generieren, die mit einem geheimen keyword(=password des users?) vermischen und dann hashen? Wäre das eine gute Session-id?
Zweitens ist es so, dass ein solcher Login nur für die jeweilige Session gültig ist. Viele Seiten bieten an, dass man eingeloggt bleibt. Soweit ich weiß wird dann das Passwort im Cookie des Browser gespeichert, oder? Das muss natürlich auch irgendwie verschlüsselt werden. Hashed man das einfach, oder macht man das komplizierter? Beim nur hashen, dürfte man aber wohl kaum den selben Hash nehmen, der auch für das hashen des Passworts in der DB verwendet wird. Oder reicht es aus, den Hash im Cookie geeignet zu salzen?

Ich habe leider keine Internetseite gefunden, die das so richtig erklärt und mich würde es schon mal interessieren, wie man das heute so macht. Natürlich muss es nicht die Anforderungen eines Systems haben, die man bei einer Bank benutzt, 100% sicher ist es zum Beispiel aufgrund der fehlenden Verschlüsselung bei der Passwort-Übertragung sowieso nicht, aber das kann man ja bei den meisten Seiten vernachlässigen.

looking glass
2008-06-01, 16:25:23
Mhhh, also bei wikipedia wird bei salted hash auf eine php und eine -net Funktion gelinkt, die den Code und erklärungen dazu beinhalten, hast Du dir das schon angesehen, oder verstehe ich die Frage falsch?

http://de.wikipedia.org/wiki/Salted_Hash

rotalever
2008-06-01, 17:00:39
Naja, wie man einen gesalzenen Hash erstellt war mir schon klar. Eben hash(Password+irgendwas zufälliges). 1000x hashen würde ich aber nicht machen, sehe da nicht so den Sinn.

Die Frage war aber eigentlich wie so eine User-Authentifizierung funktioniert. So? :
Server-Database: username; password_hash;

user logged sich ein -> sendet username und password an Server -> password_hash wird generiert -> Datenbank vergleich username und password_hash -> wenn nicht übereinstimmt -> Error! ansonsten -> SessionID generieren [1], ggf. password_hash mit geheimen key verschlüsseln [2] -> beides sowie username in user-cookie speichern -> SessionID in Datenbank speichern -> einloggen fertig

prüfen ob user eingeloggt: SessionID vergleichen, wenn OK dann ist der User eingeloggt
wenn SessionID nicht mehr vorhanden -> username und verschlüsselten password_hash aus Cookie auslesen -> verschlüsselten password_hash entschlüsseln -> username und password_hash mit Datenbank vergleichen, wenn OK dann ist der User eingeloggt.

Würde man es so machen, bzw. ist das einigermaßen sicher? Offene Fragen sind natürlich:
[1] Wie generiert man die SessionID, damit sie sicher ist?
[2] Wie verschlüsselt man den password_hash für den Cookie auf sichere weise? Da gäbe es für mich zwei möglichkeiten:
1. symmetrische Verschlüsselung des pw_hash mit einem geheimen key um ihn später auf dem Server zu entschlüsseln und dann den pw_hash von der DB zu vergleichen.
2. hash (pw_hash+geheimer key) erzeugen und später zur Überprüfung den DB-pw_hash auf gleiche Weise hashen und dann vergleichen.

Was ich mich allerdings frage ist, warum braucht man da überhaupt noch eine SessionID? Ist doch eigentlich überflüssig und ermöglicht nur zusätzliche Angriffslücken.