2011-01-04 3 views
7

Dies ist im Grunde eine Beruhigung, dass ich die ganze Registrierung/Login-Prozess tun, so weit wie Hashing/Salzen geht.Hashing & Salting - Validierung Login mit Cookies

Ich habe eine Benutzer-Tabelle mit den Feldern Passwort, Salz, Token (offensichtlich gibt es andere, aber das ist das Wichtigste). Bei der Registrierung erzeugen sie ein zufälliges Salz, und ein zufälliges Token, und es setzt im Passwort-Feld dieser:

hash("sha256", $theirpostpassword.$randomgeneratedsalt); 

Die zufällig generierte Salz und Token in ihren jeweiligen Bereichen in gespeichert werden, dass die Benutzer in der Tabellenzeile.

Also bei der Anmeldung wähle ich das Salz NUR aus der Benutzerzeile mit dem Benutzernamen sie angegeben. Ich mache dann eine Count-Abfrage, wie viele Zeilen ihre Post-Passwort mit ihren spezifischen Salz verkettet haben, und dann logge ich sie ein. Ziemlich sicher, dass ich diesen Teil habe.

Jetzt dachte ich ihre Login auf jeder Seite zu validieren ich eine Funktion lief jede Seite haben würde, die ihre Cookie überprüft, ob das Format der ID-Benutzernamen-Token finden Sie in der Zeile in der Datenbank übereinstimmt. Das bedeutet, dass bei jedem Login der Cookie mit diesen Zugangsdaten gesetzt wird.

Jetzt das einzige, was ich denken kann, um es besser zu machen, ist das Token jedes gültige Login zu ändern?

Danke für die Einsicht Jungs.

+1

Ich würde das Token von der IP des Remote-Benutzers abhängen, aber überprüfen, dass Cookie -mit dieser Info- auf jede Anfrage scheint gut zu funktionieren. – ncuesta

+1

Danke für die schnelle Antwort, ich war irgendwie gegen die IP-Prüfung, da ich weiß, dass es einige dynamische IP-Adressen gibt, die sich ziemlich oft ändern. –

+0

Sie sollten das Authentifizierungssystem nicht selbst erstellen, da so viele Dinge schiefgehen können. Verwenden Sie stattdessen facebook connect/twitter Anmelden/openid etc! – Alfred

Antwort

4

Ja, Sie sollten auf jeden Fall Token mit jedem Login ändern. Andernfalls wird ein einmal gestohlener Token für immer gestohlen. Benutzer erwarten, dass die Abmeldung ihre Sitzung vor Angriffen schützt, indem sie ihre Cookies oder andere Daten ungültig macht.

Anstatt dass das Token zufällig ist, können Sie es als Signatur verwenden, indem Sie es aus einem Hash der Benutzer-ID, der Ablaufzeit der Sitzung und was auch immer Sie wollen in dem Cookie plus einem Salz (wie das Anmeldesystem). Dieses Salz muss nicht aus der Datenbank kommen, aber es kann. Es könnte eine hartcodierte Saite sein (manchmal auch "Pfeffer" genannt). Denken Sie daran, den Cookie als ungültig zu behandeln, wenn die Ablaufzeit abgelaufen ist. Aus diesem Grund sollte das Token eine Signatur sein, um sicherzustellen, dass diese Daten nicht gefälscht wurden.

+1

Ich bin nicht damit einverstanden, dass der Token eine Signatur ist. Sie brauchen das Token als nicht zu ermitteln und der einzige Weg, dies zu garantieren, ist die Zufälligkeit. Auf alle Fälle haben Sie auch eine Unterschrift, aber ein zufälliges Token ist sehr wichtig. –

1

prüft ihre Cookies, um zu sehen, ob das Format ID-Benutzernamen-Token die Zeile in der Datenbank übereinstimmt

Sie könnten, aber das ist ziemlich teuer und Sie befasst sich nicht mit dem Problem der Sitzungsverwaltung - Das Setzen einer Cookie-Ablaufzeit in der Vergangenheit führt nicht immer zum Löschen von Cookies. Beachten Sie dies für eine Art von Funktion, die Sie sich merken sollten (aber verwenden Sie einen Offset-Pfad, um zu vermeiden, dass das Cookie jedes Mal präsentiert wird).

Sie erhalten nichts über das Speichern des authentifizierten Benutzernamens in der Sitzung. Ändern Sie die Sitzungs-ID jedoch, wenn Sie einen Benutzer authentifizieren und SSL zum Übergeben von Authentifizierungstoken verwenden.

2

Klingt für mich ziemlich gut, aber man sollte ein paar Dinge beachten:

Um Ihr Passwort-Datenbank resistent gegen Brute-Force-Angriffe machen Sie den Hash laufen könnte:

$hash = $password; 
for ($i = 0; $i < 1000; ++$i) { 
    $hash = hash("sha256", $hash . $salt); 
} 

Zweite , stellen Sie sicher, dass Sie die ganze Zeit über SSL verwenden. Ohne sie ist es für einen Angreifer ziemlich einfach, den Login-Cookie zu stehlen. Ein gutes Beispiel dafür, wie trivial es ist, finden Sie unter Feuerschatz.

Auf jeden Fall das Token bei jeder Anmeldung ändern und es für jede Anfrage ändern, um Session Fixation und Replay Attacken zu verhindern.

Sie können auch das Salz und den Hash aus der Datenbank auswählen und den Hashvergleich serverseitig (anstatt auf der Datenbank) durchführen, um die Anzahl der Round-Trips zur Datenbank zu reduzieren.

Ich würde vorschlagen, dass das Token völlig zufällig ist. Sie wollen, dass es nicht zu enthüllen ist und der beste Weg, das zu tun, ist zufällig. Sie könnte das Token an eine bestimmte IP-Adresse auch binden, aber dies sollte zusätzlich zu einem zufälligen Token, kein Ersatz sein.

Das ist alles, was mir in den Sinn kommt. Gut, dass Sie um Rat fragen, anstatt einfach nur das Passwort zu verschlüsseln und in der Datenbank zu speichern!