Hallo,
Wenn man mit srand() seedet, erzeugt rand() immer die gleiche Zufallszahlenreihenfolge.
Ich sehe ganz deutlich das Wort "wenn". Ich sah in meinem Beispiel kein srand().
»The random number generator is seeded automatically.« (http://de2.php.net/rand)
Im PHP-Code:
if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}
#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
selbst ETWAS wie ein simples
srand(microtime(true) - intval(str_replace(' ','', str_replace('.','', file_get_contents('/proc/uptime')))));
> dürfte einen Angreifer vor erhebliche Probleme stellen.
Etwas ähnliches macht PHP intern, siehe oben.
Trotzdem ist es relativ einfach, den Seed des Zufallszahlengenerators herauszubekommen, siehe bspw. <http://crypto.di.uoa.gr/CRYPTO.SEC/Randomness_Attacks_files/paper.pdf> und <http://blog.ptsecurity.com/2012/08/not-so-random-numbers-take-two.html>. Von solchen Attacken habe ich immer wieder gehört.
Und wieder ist die Moral von der Geschicht’: Verwende (mt\_)rand() für Krypto nicht.
Mathias