buone soluzioni
questo presuppone è necessario un nonce a 256 bit.
random_bytes(32)
(PHP 7.0.0+)
openssl_random_pseudo_bytes(32)
mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)
- Lettura da
/dev/urandom
Codice snippet 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 zioni
mt_rand()
rand()
uniqid()
microtime(true)
lcg_Value()
Che cosa rende una buona soluzione?
Una buona soluzione dovrebbe sfruttare un generatore di numeri pseudocasuali crittograficamente sicuro (CSPRNG). Sui sistemi operativi basati su Unix, questo può essere ottenuto leggendo direttamente da /dev/urandom
.
Ma non capisco come il token possa essere prevedibile.
Questo argomento è stato trattato in modo approfondito prima.
Ho il seguente codice:
<?php
srand(time());
$reset_password_token = rand(444444444444,999999999999);
?>
In teoria, ci sarebbe essere solo 555555555555 valori possibili per questo. Sfortunatamente, il numero attuale è molto inferiore a.
rand()
utilizza un algoritmo chiamato Linear Congruent Generator, che a causa di come è implementato in PHP 5, funziona solo con numeri interi a 32 bit senza segno. Entrambi i numeri forniti sono maggiori di 2**32
. Non sono sicuro che potrebbe traboccare. The source code non è molto illuminante in questo caso.
Tuttavia, poiché si stanno seminando i numeri casuali con time()
, si incontreranno dei problemi. Rapidamente, eseguire questo codice:
<?php
srand(1431223543);
echo rand()."\n";
Si dovrebbe vedere 1083759687
nella tua console. In generale, la differenza di tempo tra i computer su Internet è piuttosto piccola. Probabilmente potresti tenere conto solo di un possibile jitter fino a 2 secondi in ogni fuso orario, e ci vorranno solo 120 ipotesi (caso peggiore) per iniziare a prevedere l'output di numeri casuali. Per sempre.
Per qualsiasi motivo relativo alla sicurezza dell'applicazione, utilizzare un CSPRNG.
Il seme è solo un problema. L'uso di 'rand' stesso, anche con un seme imprevedibile, è una vulnerabilità di sicurezza. –