Moin!
Allerdings ist diese ID komplett auf berechenbaren Komponenten aufgebaut.
...eben deswegen. Auch bei anderen Lösungen...
...auch bei deiner Lösung. ;)
Gerade bei Session-IDs sollte sowas aber nicht passieren, denn damit kann man die generierten Session-IDs bei Kenntnis des Algorithmus raten.
Hier hätte ich jetzt lieber "besser raten" geschrieben. Wenn klar ist, dass die Session-ID von ein paar quasi-konstanten Werten und der Zeit abhängt, und diese Daten dann allesamt durch einen Verwürfelungsalgorithmus geschickt werden (crypt ist in diesem Falle noch schlimmer, als MD5, weil kürzer), dann kann man leicht brute-forcen.
Andererseits: Wenn man eine augenscheinlich zufällige Session-ID sieht, und nicht mehr, dann kann man noch soviel Rumprobieren und Raten und wird trotzdem nicht auf den Algorithmus kommen.
Dazu reicht ja im Prinzip schon eine einzige, nicht im Algorithmus festgelegte Komponente, auf die auch sonst niemand kommt, also beispielsweise ein fester Salt-Wert, der immer noch mit ins MD5 eingeht.
Ich behaupte mal, dass die UNIQUE_ID, die aktuelle Zeit sowie ein fester, aber je Installation unterschiedlicher Wert zusammengenommen reichlich wechselnde Informationen liefern, um mit MD5 einen schön zufälligen Wert für eine Session-ID zu gewinnen.
Wenn du befürchten mußt, dass ein Angreifer den konfigurierten Festwert kennt, dann hast du ohnehin ganz andere Systemsicherheitsprobleme.
Es gibt noch einen anderen Grund dafür zu sorgen dass eine sessionID eindeutig ist: Das recyclen der sessionDB auf dem Server. Mal angenommen es haben einige 1000 User Sessions aufgebaut wofür eine Auth. erforderlich war. Von diesen Sessions könnten einige als *Leichen* in der DB bestehen bleiben und: wie es der Zufall so will kommt einer mit einer SessionID daher die es noch in der DB gibt. Aber das wäre ja dann wirklich Zufall...
Das ist alles eine Frage des angebotenen Zahlenraumes für die Session-ID.
Wenn du mit Crypt arbeitest, dann kriegst du als Resultat einen 13 Zeichen langen String mit alphanumerischen Zeichen heraus. Crypt selbst liefert nur 56 Bit = 7,2e+16 verschiedene, gleichverteilte Werte.
MD5 hingegen liefert einen 16-Byte-Wert, also 128 Bits. Das sind 3,4e+38 verschiedene Werte.
Und wenn alle Stricke reißen, nimmst du SHA1 als Verwürfler: Der Algorithmus liefert 160 Bit = 1,4e+48 verschiedene Werte.
Die einzige Möglichkeit, zufälliger als beim Lotto auf eine existierende Session zu treffen, ist durch a) identische Eingaben an die Verwürflungsfunktionen, oder b) durch Kollisionen in den Verwürflungsfunktionen (unterschiedliche Eingaben ergeben denselben Ausgabewert).
Für MD5 möchte ich mal ausschließen, dass es zu Kollisionen kommt, wenn man den Algorithmus mit weniger als 128 Bit langen, garantiert unterschiedlichen Strings füttert. Insbesondere sollte es keinerlei Kollision bei sehr ähnlichen Strings geben - also ist eine ständig wachsende Komponente wie die Zeit an dieser Stelle nicht verkehrt. Sie ändert nur wenig am String, was aber große Auswirkungen beim Resultat hat.
Abgesehen davon gilt das von Lude gesagte: Eine Session darf nicht unendlich lange offen bleiben, sondern muß ein Verfallsdatum haben. Ist dieses überschritten, werden alle Sessiondaten gelöscht.
Was deinen Test angeht: Wenn du zeitbasiert Session-IDs generierst und in einer schnellen Schleife prüfst, ob identische IDs vorkommen, sagt das nicht so viel über die Brauchbarkeit des Algorithmus aus. Zeit ist ein kritischer, aber auch der limitierende Faktor. Ein Webserver erhält nur eine gewisse Anzahl von Requests pro Zeit. Aber was vermieden werden sollte ist, dass zwei Requests, die gleichzeitig ablaufen (bei Mehrprozessormaschinen ist das sogar möglich) nicht dieselbe SID erhalten.
- Sven Rautenberg
--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|