Elderan
0
Hallo,
Neben der Erstellung von Session ID's z.B. wird oft auf die normale Rand Methode zurückgegriffen, wenn man ein zufälliges Passwort generieren möchte.
Wer kennt nicht solch ein PHP Code:
Das Problem hierdran, es gibt gerade mal 1 Mio. verschiedene Startwert (ggf. um den Faktor 10 oder 100 weniger), die man heutezutage in Bruchteil einer Sekunde überprüfen kann.
Denkt man, man tut was gutes für die Sicherheit und zwingt dem User ggf. ein 'zufälligs' Passwort auf, aber einen Angreifer der die Hashs in die Hand bekommt wird es freuen, er braucht nur 1 Mio. Passwörter probieren.
Wobei rand() auch noch vom Betriebssystem/(ggf. vom Compiler) abhängt.
Wenn man wirklich zufällige Daten bekommen würde, dürfte man eigentlich kein Muster erkennen.
Naja Bild 1 ist rand() unter Windows XP (PHP 5.2.1/XAMPP), Bild 2 der Zufallsgeneator aus Glibc mit rand_type == TYPE_0 und das letzte Bild mt_rand.
Aber das ein kryptographisch sicherer Zufallsgenerator muss nicht nur wirklich gute Zufallszahlen (statistisch betrachten) generieren, sondern an diesen werden noch weitere Aspekte gestellt.
z.B. muss es unmöglich, aus bisherigen Zufallszahlen auf zukünftige zu schließen (beim TYPE_0 Generator des Glibc reicht 1 Zufallszahl um alle weiteren zu berechnen) und vieles mehr.
Gute (kryptographisch sichere) Zufallsgeneratoren zu entwickelt ist wirklich schwierig.
Mehr zum Thema hier:
Cryptanalytic Attacks on Pseudorandom Number Generators
Ja das stimmt, die Standard-Rand Funktion ist nur selten kryptographisch sicher, allerdings wissen dieses nicht alle und wird dennoch oft für Dinge eingesetzt, für die diese Funktion nicht geeignet ist.Original von trivilian
Ich hoffe ich verstehe Dich jetzt nicht falsch. Damit wird eigentlich offensichtlich, dass Funktionen wie rand() in herkömmlichen Implementierungen nicht kryptografisch sicher sind.
Neben der Erstellung von Session ID's z.B. wird oft auf die normale Rand Methode zurückgegriffen, wenn man ein zufälliges Passwort generieren möchte.
Wer kennt nicht solch ein PHP Code:
PHP:
<?php
$buchstaben = "abcdefghijklmnopqrstuvwxyz0123456789";
$pw = "";
srand((double)microtime()*1000000);
for($i=0;$i<8;$i++)
$pw .= $buchstaben{rand(0,strlen($buchstaben)-1)};
echo $pw
?>
Das Problem hierdran, es gibt gerade mal 1 Mio. verschiedene Startwert (ggf. um den Faktor 10 oder 100 weniger), die man heutezutage in Bruchteil einer Sekunde überprüfen kann.
Denkt man, man tut was gutes für die Sicherheit und zwingt dem User ggf. ein 'zufälligs' Passwort auf, aber einen Angreifer der die Hashs in die Hand bekommt wird es freuen, er braucht nur 1 Mio. Passwörter probieren.
Die Parameter für a, b und m sind ja bekannt, wegen es ausreicht, 1 Zufallswert zu kennen (erraten) um damit die gesamte Kette nachzuvollziehen.In der Kryptografie dagegen kommt er nicht zum Einsatz, da man schon aus wenigen Werten der erzeugten Zahlenfolge die Parameter a und b und damit die vollständige Zahlenfolge berechnen kann.
Dies kann man auch ganz leicht grafisch zeigen:Leider kann ich das selbst mathematisch nicht beweisen, aber auf der Wikipedia wurde es auch angedeutet:
PHP:
<?PHP
//Seed fuer den Zufallsgenerator
$seed = (double)microtime()*1000000;;
mt_srand($seed);
srand($seed);
$badRandomSeed = $seed;
$generator = 3;
function badRandom($max) {
//Generator in der GNU C Lib mit rand_type == TYPE_0
global $badRandomSeed, $generator;
$badRandomSeed = (($badRandomSeed * 1103515245) + 12345) & 0x7fffffff;
switch($generator) {
case 1: return rand(0,$max);
case 2: return mt_rand(0,$max);
default: return ($badRandomSeed%$max);
}
}
header ("Content-type: image/gif");
$image = imagecreate(500,500);
$farbe_body=imagecolorallocate($image,255,255,255);
$farbe_b = imagecolorallocate($image,0,0,0);
for($i=0;$i<15000;$i++) {
$x = badRandom(500);
$y = badRandom(500);
imagesetpixel($image,$x ,$y ,$farbe_b);
}
imagegif($image);
?>
Wenn man wirklich zufällige Daten bekommen würde, dürfte man eigentlich kein Muster erkennen.
Naja Bild 1 ist rand() unter Windows XP (PHP 5.2.1/XAMPP), Bild 2 der Zufallsgeneator aus Glibc mit rand_type == TYPE_0 und das letzte Bild mt_rand.
Aber das ein kryptographisch sicherer Zufallsgenerator muss nicht nur wirklich gute Zufallszahlen (statistisch betrachten) generieren, sondern an diesen werden noch weitere Aspekte gestellt.
z.B. muss es unmöglich, aus bisherigen Zufallszahlen auf zukünftige zu schließen (beim TYPE_0 Generator des Glibc reicht 1 Zufallszahl um alle weiteren zu berechnen) und vieles mehr.
Gute (kryptographisch sichere) Zufallsgeneratoren zu entwickelt ist wirklich schwierig.
Mehr zum Thema hier:
Cryptanalytic Attacks on Pseudorandom Number Generators