2016-06-27 7 views
1

Ich versuche ein Cookie zu erstellen, um die Benutzer meiner Website zu protokollieren. Ich lasse die Person von mehreren Geräten aus einloggen. Kann ich ein identisches Cookie für alle Geräte des Benutzers erstellen? Oder sollte ich mehrere verschiedene Cookies für verschiedene Geräte speichern (und warum)?Wie viele Cookies sollte ich für mehrere Geräte erstellen?

Eigentlich sehe ich kein Problem mit einem gemeinsamen Cookie für einen bestimmten Benutzer auf mehreren Geräten. Auch dieser Cookie ist nicht veränderbar. Dies wird immer behoben, bis der Benutzer sein Passwort ändert. Ich schaffe das Cookie wie folgt aus:

md5($password.$user_id.$username); 

Das Cookie auf dem Passwort basiert, weil ich Abmelde ihn wollen, wenn er sein Passwort ändert, sonst wird er in alle Geräte eingeloggt sein, dass er bereits angemeldet.

Mache ich das richtig richtig?

+0

gut wie Cookies auf der Maschine gespeichert sind, wie würden Sie nur eine verwenden? –

+0

@Dagon Was? Ja, sie sind auf der Client-Seite gespeichert. – stack

+0

gut, wenn sie auf mehreren Geräten sind, wird jedes Gerät einen Cookie benötigen. –

Antwort

1

Der kryptografische Hash-Algorithmus MD5 hat bereits begonnen, zu brechen, vor allem in Bezug auf seine Kollisionsresistenz-Eigenschaft, sowie Pre-Bild-Widerstand leicht. Siehe the Wikipedia article, in the security section.

Daher würde ich MD5 nicht für etwas Sicherheitsrelevante verwenden. Eine ähnliche Geschichte mit SHA-1, in der es begann gebrochen zu sein, also würde ich SHA-2 verwenden, wenn Sie tatsächlich einen Hash-Algorithmus benötigen.

Das Problem mit Ihrem Ansatz ist, dass Sie das Token nicht einfach von einzelnen Geräten widerrufen können. Wenn ein Passwort als Eingabe für Ihren Algorithmus verwendet wird, kann es anfällig für einen Hash-Crack-Angriff werden, sollten die anderen Werte bekannt sein. Verlassen Sie sich auch nicht darauf, dass Ihre Methode geheim ist. Kerckhoffs's principle gibt an "Ein Kryptosystem sollte sicher sein, auch wenn alles über das System, außer dem Schlüssel, öffentlich bekannt ist."

Ein weiteres Problem mit Ihrem Ansatz besteht darin, dass Ihr Hashalgorithmus Klartextzugriff auf das Kennwort benötigt, was darauf hindeuten könnte, dass Sie Kennwörter unsicher speichern. Kurz ensure you are using bcrypt for password storage. Natürlich erstellen Sie möglicherweise den Cookie und speichern eine serverseitige Version an einem Punkt, an dem der Benutzer sein Passwort eingibt. Wenn Sie jedoch Cookies bei einer Passwortänderung automatisch ungültig machen wollen, denke ich nicht daran.

Die sicherste Methode zum Verwalten von Geräten mit Token besteht darin, ein zufälliges 128-Bit-Token pro Gerät zu generieren und diesen Hash-Code mit SHA-2 in Ihrer Datenbank zu speichern. Stellen Sie sicher, dass ein CSPRNG zum Generieren des Tokens verwendet wird.

Deshalb:

 
    Cookie value: 128-bit token 
    Database value: SHA-2(128-bit token) 

Bitte beachte, dass Salze sind nicht für die Werte solchen Bitstärke erforderlich. Wenn ein Benutzer sein Kennwort ändert, löscht er einfach alle serverseitigen Tokens für den Benutzer. Darüber hinaus können Sie dem Benutzer erlauben, Token für verschiedene Geräte einzeln zu sperren, ohne dass eine Passwortänderung erforderlich ist.

Der Grund für das Hashing auf der Serverseite ist die Verringerung von Session-Hijacking, falls ein Angreifer Zugriff auf Ihre Sitzungstabelle erhält.

+0

Vielen Dank .. upvote ...! Nur du hast * gesagt "Token für verschiedene Geräte einzeln zu entziehen" * .. das heißt, jedes Gerät hat seinen eigenen Cookie. Soll ich also mehrere Cookies * (in mehreren Geräten) * für ** einen ** Benutzer speichern? – stack

+0

Ja, warum nicht ein anderes Cookie pro Gerät haben? Also eine Eins-zu-viele-Beziehung zwischen Benutzer- und Geräte-Token. – SilverlightFox

+0

Ok, sag mir, warum nicht ein identisches Cookie für alle Geräte haben? Warum kann der Cookie nicht auf allen Geräten des Benutzers gleich sein? Schauen Sie, [hier] (https://gist.github.com/anonymous/14749dca7640e3b9e318cb7729e65f8c) ist meine Tabellenstruktur, Wie kann ich mehrere Cookies für einen Benutzer speichern? Ich habe nur eine Spalte für Cookie, wenn ich für ein neues Gerät aktualisieren, wird das vorherige Gerät abmelden. – stack

1

Mache ich das richtig richtig?

Leider nicht.

Durch die Erstellung von Cookies mit diesem Design: md5($password.$user_id.$username), implementieren Sie sie in ihrem meisten naiven Ansatz. Eine grundlegende Faustregel besagt, dass Benutzeranmeldeinformationen niemals in einem Cookie gespeichert werden. Dies gilt für alle leistungsstarken Hashing-Algorithmen. Und für den MD5-Algorithmus Sie verwenden, ist es nicht so stark (Transcript Collision Attacks: Breaking Authentication in TLS, IKE, and SSH)

Oder sollte ich speichern mehrere unterschiedliche Cookies für verschiedene Geräte (und warum)?

Sie müssen nicht. Nutzlos. Und als ein gutes Sicherheitsprinzip, fügen Sie niemals Funktionalität (Code) zu Ihrer Software hinzu, wenn Sie sie nicht benötigen, ansonsten können Sie die attack surface verbessern.

+0

Ok danke .. upvote – stack

Verwandte Themen