To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:
http://www.openwall.com/php_mt_seed/README
(PHP 4, PHP 5, PHP 7, PHP 8)
mt_rand — Erzeugt eine Zufallszahl nach dem Mersenne-Twister-Verfahren
Viele Zufallszahlengeneratoren, die auf älteren libc-Versionen basieren, haben seltsame oder doch zumindest unerwartete Verhaltensweisen und sind zudem recht langsam. Die Funktion mt_rand() ist ein vollwertiger Ersatz für das ältere rand(). Sie verwendet einen Zufallszahlengenerator mit den bekannten Charakteristika des » Mersenne Twisters, der Zufallszahlen viermal schneller generiert als der durchschnittliche libc-rand()-Aufruf.
Wenn die Funktion ohne Angabe von min
und/oder
max
aufgerufen wird, gibt
mt_rand() eine Pseudozufallszahl zwischen 0 und
mt_getrandmax() zurück. Wenn zum Beispiel eine
Zufallszahl zwischen 5 und 15 (inklusive) benötigt wird, muss
mt_rand(5, 15)
verwendet werden.
Diese Funktion erzeugt keine kryptografisch sicheren Werte und darf nicht für kryptografische Zwecke verwendet werden oder für Zwecke, bei denen die zurückgegebenen Werte nicht abschätzbar sein dürfen.
Falls kryptographisch sichere Zufallszahlen benötigt werden, kann der Random\Randomizer mit der Random\Engine\Secure-Engine verwendet werden. Für einfache Anwendungsfälle bieten die Funktionen random_int() und random_bytes() eine bequeme und sichere API, die den CSPRNG des Betriebssystems verwendet.
min
Der optionale niedrigste Wert, der zurückgegeben werden kann (Standardwert: 0)
max
Der optionale höchste Wert, der zurückgegeben werden kann (Standardwert: mt_getrandmax())
Ein zufälliger Integerwert zwischen min
(oder 0) und
max
(oder mt_getrandmax(),
inklusive) oder false
, wenn max
kleiner ist als
min
.
Version | Beschreibung |
---|---|
7.2.0 | mt_rand() erhielt einen Bugfix für einen Modulus-Verzerrungsfehler. Das bedeutet, dass sich Folgen mit einem bestimmten Startwert ab PHP 7.1 auf 64bit-Rechnern unterscheiden können. |
7.1.0 | rand() ist nun ein Alias von mt_rand(). |
7.1.0 |
mt_rand()
verwendet nun
eine korrekte Version des Mersenne-Twister-Algorithmus. Um auf das
vorherige Verhalten auszuweichen, kann mt_srand()
mit MT_RAND_PHP als zweitem Parameter verwendet
werden.
|
Beispiel #1 mt_rand()-Beispiel
<?php
echo mt_rand(), "\n";
echo mt_rand(), "\n";
echo mt_rand(5, 15), "\n";
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
1604716014 1478613278 6
Der Bereich von min
und max
darf nicht größer sein als mt_getrandmax(). Das heißt,
(max
- min
) <=
mt_getrandmax(). Andernfalls kann
mt_rand() schlechtere Zufallszahlen liefern als es
sollte.
To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:
http://www.openwall.com/php_mt_seed/README
To see some systematic deviations from a universal distribution run:
<?php
$alfabet = str_split('ADHKLMNPSTUWX');
$countalfabet = count($alfabet)-1;
$code = array_fill_keys($alfabet, 0);
for ($L=0; $L<80*$countalfabet; $L++)
{
$lettr = floor(mt_rand ( 0, $countalfabet ));
$code[$alfabet[$lettr]]++;
}
foreach($code as $L => $Freq)
{
for($F=0; $F<$Freq; $F++)
{
echo $L;
}
echo "\n<br/>";
}
?>
The seed is the PID + LCG (https://github.com/php/php-src/search?q=GENERATE_SEED&unscoped_q=GENERATE_SEED)