Gute Lösungen
Dies setzt voraus, ein 256-Bit-nonce erforderlich ist.
random_bytes(32)
(PHP 7.0.0+)
openssl_random_pseudo_bytes(32)
mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)
- von
/dev/urandom
Lesen
-Code-Snippet für # 4:
<?php
function getRandom($bytes)
{
// Read only, binary safe mode:
$fp = fopen('/dev/urandom', 'rb');
// If we cannot open a handle, we should abort the script
if ($fp === false) {
die("File descriptor exhaustion!");
}
// Do not buffer (and waste entropy)
stream_set_read_buffer($fp, 0);
$entropy = fread($fp, $bytes);
fclose($fp);
return $entropy;
}
Bad Solu
gen
mt_rand()
rand()
uniqid()
microtime(true)
lcg_Value()
Was eine Lösung gut macht?
Eine gute Lösung sollte einen kryptografisch sicheren Pseudozufallszahlengenerator (CSPRNG) nutzen. Auf Unix-basierten Betriebssystemen kann dies durch direktes Lesen von /dev/urandom
erreicht werden.
Aber ich verstehe nicht, wie das Token vorhersehbar sein kann.
Dieses Thema wurde ziemlich ausführlich behandelt.
ich den folgenden Code haben:
<?php
srand(time());
$reset_password_token = rand(444444444444,999999999999);
?>
Theoretisch wäre es sei nur 555555555555 mögliche Werte dafür. Leider ist die tatsächliche Nummer viel niedriger.
rand()
verwendet einen Algorithmus, der als linearer kongruenter Generator bezeichnet wird, der aufgrund seiner Implementierung in PHP 5 nur mit vorzeichenlosen 32-Bit-Ganzzahlen arbeitet. Beide von Ihnen angegebenen Nummern sind größer als 2**32
. Ich bin mir nicht sicher, ob es überlaufen würde. The source code ist in diesem Fall nicht sehr aufschlussreich.
Da Sie jedoch Ihre Zufallszahlen mit time()
seeding, werden Sie in Schwierigkeiten geraten. Schnell, führen Sie diesen Code:
<?php
srand(1431223543);
echo rand()."\n";
Sie sollten 1083759687
in der Konsole sehen. Im Allgemeinen ist der Zeitunterschied zwischen Computern im Internet ziemlich klein. Sie könnten wahrscheinlich nur einen möglichen Jitter von bis zu 2 Sekunden in jeder Zeitzone berücksichtigen, und Sie würden nur 120 Berechnungen (im schlimmsten Fall) benötigen, um mit der Vorhersage der Zufallszahlenausgabe zu beginnen. Für immer.
Bitte verwenden Sie für alles, was die Sicherheit Ihrer Anwendung betrifft, ein CSPRNG.
Der Seed ist nur ein Problem. Die Verwendung von "rand" selbst, selbst mit einem unvorhersehbaren Seed, ist eine Sicherheitslücke. –