Moin Moin!
Hier eine Perl-Funktion, die einen sehr eindeutigen Key erzeugt:
Aber nicht notwendigerweise einen guten Key.
sessionid generieren
sub initid{
salts erzeugen
my @salts = ("a".."z");
shuffle(@salts);
shuffle ist kein Buildin. Woher kommt diese Funktion?
my $salt = join "", @salts;
und nun crypten
my $zufall = crypt($salt,time.$$);
Crypt nutzt die ersten zwei Zeichen von salt. Das ergibt 26*26=676 mögliche Kombinationen. time() ist per HTTP sekundengenau zu ermitteln. $$ (PID) ist mehr oder weniger monoton steigend, bis ein Wrap-Around bei 2^15 oder 2^16 erfolgt. $$ wird auf Unix-Systemen nie 0 und nie 1 sein, und auf typischen Systemen auch eher selten eine Zahl unter 20 (Kernel-Prozesse belegen die ersten paar PIDs).
Ich würde mal sagen, das sollte recht einfach von einem externen Rechner vorberechenbar sein.
Ein typischer Anfängerfehler ist, selbst einen Zufallsgenerator zu schrieben. Leider sind die selten zufällig.
Der folgende Code aus einem meiner Projekte erzeugt eine ID, die nur von Perls Pseudozufallsgenerator abhängig ist:
my @idchars=('A'..'Z','a'..'z','0'..'9');
my $idcharCount=@idchars;
my $idlen=72;
sub newID # => $id
{
my $id='';
$id.=$idchars[int rand $idcharCount] for 1..$idlen;
return $id;
}
Richtig gut wird die ID, wenn man sich aus einem harten Zufallsgenerator (minimal /dev/random unter Linux) eine Hand voll Bytes holt und diese "nackt" oder Base64-codiert verwendet.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".