Cruz: sichere Session ID generieren

Hi Leute,

ich brauche zuverlässige Session IDs für eine gut besuchte Plattform und habe entdeckt, dass ich mit time und einer Zufallszahl nicht sehr weit komme. Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so recht wie ich ansetzen soll. Wie macht ihr das denn so?

Ciao,
Cruz

  1. Moin!
    Naja, in PHP gibt es den unix timestamp in microsekunden, dazu noch ne zufallszahl, oder eine md5-codierte IP, vielleicht noch andere Client-Informationen, das kannst Du ja nach belieben kombinieren, ich denke das sollte nicht so schwer sein :-)
    Grüße
    Andreas

  2. Hi,

    ich mache es so:

    ---------------------------------------------------------------------
    my $sid;
    srand(time);
    my @letters = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9);
    my $i;
    my $length = '24';
    for($i=0;$i<$length;$i++)
    {
     my $random_letter = $letters[int(rand($#letters))];
     $sid .= $random_letter;
    }

    Die Länge und die zu verwendenden Zeichen der sid kanst du ja nach belieben variieren.

    Viele Grüße

    Rol

    1. Hi Rol,

      Ich danke dir für den Code, das war ein echt konstruktiver Beitrag. :)

      Nur Leider hat dein Code genau das selbe Problem, wie meins.
      Durch das srand(time) kriegst du für eine volle Sekunde die selbe Zufallszahl. Wenn du diesen Code in einer Subroutine packst, und es 100000 mal hintereinander eine Session ID generieren lässt, dann siehst du, dass der Code in 2000-er Blöcken die selbe Session ID ausgibt.

      Ich suche einen Ansatz oder ein Stück Code, das den oben genannten Test besteht.

      Ciao,
      Cruz

      Hi,

      ich mache es so:


      my $sid;
      srand(time);
      my @letters = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9);
      my $i;
      my $length = '24';
      for($i=0;$i<$length;$i++)
      {
      my $random_letter = $letters[int(rand($#letters))];
      $sid .= $random_letter;
      }

      Die Länge und die zu verwendenden Zeichen der sid kanst du ja nach belieben variieren.

      Viele Grüße

      Rol

  3. Hi,

    warum nicht mal auf php.net gucken ??? dort nach md5 suhen und schon der erste userkommentar sagt aus:
    ------------------
    U can generate unique string with this way :

    srand((double)microtime()*1000000);
    $unique_str = md5(rand(0,9999999));

    print $unique_str;

    It is good for password, cookies or Session_ID (if u're using PHP3) ...

    LexZEUS
    --------------------

    aber warum soll man auch in handbüchern oder dokus blättern wann man im forum fragen kann.....

    sorry, aber erst kucken und dann frage

    mfg

    Korbinian Bachl
    www.whiskyworld.de

    PS: unter google.de "php session erzeugen" eingeben bringt das gleiche ergebniss auf mehreren hundert seiten...

    1. Erstens weil ich nach Perl Code suche und nicht nach PHP. Und zweitens weil ich schon ausreichend gesucht habe und ich nur Hinweise auf Module gefunden habe, aber ich möchte unbedingt eigenen Code haben.

      Erst lesen, dann denken, dann Motzen.

      Gruß
      Cruz

      Hi,

      warum nicht mal auf php.net gucken ??? dort nach md5 suhen und schon der erste userkommentar sagt aus:

      U can generate unique string with this way :

      srand((double)microtime()*1000000);
      $unique_str = md5(rand(0,9999999));

      print $unique_str;

      It is good for password, cookies or Session_ID (if u're using PHP3) ...

      LexZEUS

      aber warum soll man auch in handbüchern oder dokus blättern wann man im forum fragen kann.....

      sorry, aber erst kucken und dann frage

      mfg

      Korbinian Bachl
      www.whiskyworld.de

      PS: unter google.de "php session erzeugen" eingeben bringt das gleiche ergebniss auf mehreren hundert seiten...

      1. Hi!
        scheint mit PERL nicht ganz so einfach, was :-) Aber das prinzip ist das riochtige, das einzige was Du noch brauchst sind micro-Sekunden, anscheinend kann das PERL nicht, vielleicht hilft Dir das:

        http://www.perldoc.com/perl5.6.1/pod/perlfaq8.html#How-can-I-measure-time-under-a-second-

        oder auch http://perldoc.com/cgi-bin/htsearch?words=time()&restrict=perl5.6.1

        Grüße
        Andreas

  4. Hi Cruz,

    ich brauche zuverlässige Session IDs für eine gut besuchte Plattform

    was stellst Du Dir denn unter einer "zuverlässigen" Session-ID vor?
    Eine ID ist erst mal nur eine Zahl. Die kann nicht "zuverlässig" sein

    • höchstens das Verfahren zu ihrer Bestimmung ...

    und habe entdeckt, dass ich mit time und einer Zufallszahl nicht
    sehr weit komme.

    Auf dem Weg wohin?

    Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so
    recht wie ich ansetzen soll. Wie macht ihr das denn so?

    Mit einer Aufgabenstellung.
    Welche Anforderungen hast Du an eine Session-ID?

    Wenn sie beispielsweise eindeutig sein soll und sonst nichts, dann
    würde ich behaupten, daß innerhalb einer Session (Achtung, zufällige
    Namensgleichheit) Deines Betriebssystems Prozeß-IDs unique sein sollten,
    also das Paar aus Prozeß-ID und timestamp insgesamt unique ist (weil
    Deine Betriebssystem-Session länger dauert als die Auflösungsgrenze
    des time stamp).

    Aber ich kann mir durchaus eine Menge weiterer Eigenschaften einer
    Session-ID vorstellen, die über "unique" weit hinausreichen würden.

    Viele Grüße
          Michael

    1. Hallo Michael,

      Ja unique sollte sie natürlich sein. Mit zuverlässig meinte ich eigentlich, dass die Gefahr nicht besteht, dass zwei mal hintereinander die selbe Session ID generiert wird.

      Außer der Zuverlässigkeit und dass die Session ID numerisch oder ein String ist, was gibt es denn da noch für Eigenschaften, die wichtig sein können?

      Ich habe vor zu FastCGI zu wechseln, und da die Scripte ja dann länger laufen, befürchte ich, dass timestamp und PID keine eindeutige Session IDs ergeben, wenn mehrere in einer Sekunde generiert werden. Was meinst du?

      Ciao
      Cruz

      Hi Cruz,

      ich brauche zuverlässige Session IDs für eine gut besuchte Plattform

      was stellst Du Dir denn unter einer "zuverlässigen" Session-ID vor?
      Eine ID ist erst mal nur eine Zahl. Die kann nicht "zuverlässig" sein

      • höchstens das Verfahren zu ihrer Bestimmung ...

      und habe entdeckt, dass ich mit time und einer Zufallszahl nicht
      sehr weit komme.

      Auf dem Weg wohin?

      Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so
      recht wie ich ansetzen soll. Wie macht ihr das denn so?

      Mit einer Aufgabenstellung.
      Welche Anforderungen hast Du an eine Session-ID?

      Wenn sie beispielsweise eindeutig sein soll und sonst nichts, dann
      würde ich behaupten, daß innerhalb einer Session (Achtung, zufällige
      Namensgleichheit) Deines Betriebssystems Prozeß-IDs unique sein sollten,
      also das Paar aus Prozeß-ID und timestamp insgesamt unique ist (weil
      Deine Betriebssystem-Session länger dauert als die Auflösungsgrenze
      des time stamp).

      Aber ich kann mir durchaus eine Menge weiterer Eigenschaften einer
      Session-ID vorstellen, die über "unique" weit hinausreichen würden.

      Viele Grüße
            Michael

    2. Hallo nochmal Michael,

      ich habe es inzwischen geschafft mein Ziel eindeutig zu artikulieren. ;)

      Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs generiert werden. srand(time) und time liefern in der selben Sekunde immer die selben Werte.

      Ciao,
      Cruz

      1. Hallo,

        srand(time) und time liefern in der selben Sekunde immer die selben Werte.

        Du verwendest die falsche Funktion, nimm rand().

        Näheres dazu:
        http://www.perldoc.com/perl5.6.1/pod/func/rand.html
        http://www.perldoc.com/perl5.6.1/pod/func/srand.html

        Grüße
          Klaus

        1. Ja das war es! Danke!

          Cruz

          Hallo,

          srand(time) und time liefern in der selben Sekunde immer die selben Werte.

          Du verwendest die falsche Funktion, nimm rand().

          Näheres dazu:
          http://www.perldoc.com/perl5.6.1/pod/func/rand.html
          http://www.perldoc.com/perl5.6.1/pod/func/srand.html

          Grüße
            Klaus

      2. Hi!

        Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs generiert werden. srand(time) und time liefern in der selben Sekunde immer die selben Werte.

        mit microtime sind es eine Mio Werte pro Sekunde, und wenn das in PHP geht geht das wohl auch in PERL, oder?

        Grüße
        Andreas

      3. Hi Cruz,

        ich habe es inzwischen geschafft mein Ziel eindeutig zu artikulieren. ;)
        Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal
        hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs
        generiert werden. srand(time) und time liefern in der selben Sekunde
        immer die selben Werte.

        darf ich "von einem Script" so verstehen, daß dieses Skript ein Gedächtnis
        besitzt, welches von einem Session-ID-Aufruf zum nächsten Bestand hat?

        Wenn ja, dann kannst Du einfach einen autoincrement-Zähler ($i++) dazu
        nehmen. Das Tripel aus $PID, timestamp und Zähler ist sicherlich unique.
        Mit sprintf formatiert in einen schönen langen String bekommst Du eine
        ca. 20-25 Ziffern lange Zahl, die Du als Session-ID verwenden kannst.

        Viele Grüße
              Michael