2009-10-11 6 views
6

Eventuali duplicati:
Secure random number generation in PHPCome si generano numeri casuali protetti da crittografia con PHP?

Abbiamo bisogno di generare una stringa crittograficamente casuale da utilizzare come un token di autenticazione, che sarà legato a dati di sessione nel database. Stiamo usando PHP, che non sembra avere un generatore di numeri casuali adatto integrato. Come possiamo generare una stringa casuale crittograficamente sicura di lunghezza N usando php?

Inoltre, a causa della natura della nostra applicazione, shell_exec è fuori dal tavolo.

+0

Trova la risposta qui: http://stackoverflow.com/questions/1182584/secure-random-number-generation-in-php –

risposta

-6

Che dire di uniqid? i documenti hanno un esempio di come può essere usato per i cookie/sessioni.

+0

Questo sembra essere l'approccio migliore - quando combinato con mt_rand come descritto nella Manuale. – Travis

+7

uniqid non è crittograficamente sicuro, è progettato specificamente per non restituire mai lo stesso numero due volte, poiché si basa sull'orologio di sistema, ma ha un'entropia piuttosto bassa se solo un hacker conosce approssimativamente quando è stato generato. – aaaaaaaaaaaa

+0

@ebusiness: OP non ha realmente bisogno della funzione crittograficamente protetta. e 'uniqid' è perfetto per il suo caso. – SilentGhost

-4

Fuori dalla parte superiore della mia testa: prendi micro tempo, moltiplicalo per microtime% 100 e fai qualche rand su sha1 del risultato ricevuto.

+5

Questo non sarà molto sicuro. Non utilizzare l'orologio di sistema se non si desidera che l'uscita sia prevedibile. –

+0

Dan ha ragione. Laddove la sicurezza è importante, i semi basati sul tempo corrente non offrono abbastanza entropia. – christophe

4

A seconda della piattaforma, è possibile utilizzare/dev/urandom o CAPICOM. Questo è ben riassunto in this comment from Mark Seecof:

"Se avete bisogno di qualche bit pseudocasuali per scopi crittografici di sicurezza o (uovo, IV casuale per cifrario a blocchi, sale casuale per hash della password) mt_rand() è una povera fonte Sulla maggior parte. piattaforme Unix/Linux e/o MS-Windows è possibile ottenere una migliore qualità di bit pseudocasuali dalla libreria OS o del sistema, in questo modo:

<?php 
// get 128 pseudorandom bits in a string of 16 bytes 

$pr_bits = ''; 

// Unix/Linux platform? 
$fp = @fopen('/dev/urandom','rb'); 
if ($fp !== FALSE) { 
    $pr_bits .= @fread($fp,16); 
    @fclose($fp); 
} 

// MS-Windows platform? 
if (@class_exists('COM')) { 
    // http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx 
    try { 
     $CAPI_Util = new COM('CAPICOM.Utilities.1'); 
     $pr_bits .= $CAPI_Util->GetRandom(16,0); 

     // if we ask for binary data PHP munges it, so we 
     // request base64 return value. We squeeze out the 
     // redundancy and useless ==CRLF by hashing... 
     if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); } 
    } catch (Exception $ex) { 
     // echo 'Exception: ' . $ex->getMessage(); 
    } 
} 

if (strlen($pr_bits) < 16) { 
    // do something to warn system owner that 
    // pseudorandom generator is missing 
} 
?> 

NB: è generalmente sicuro di lasciare sia il tentativo di leggere/dev/urandom e il tentativo di accedere a CAPICOM nel tuo codice, anche se ognuno fallirà silenziosamente sulla piattaforma dell'altro. Lasciali entrambi lì così il tuo codice sarà più portabile. "

+0

Grazie - credo che questo sia il modo migliore, dal momento che/dev/urandom usa una varietà di fonti di entropia, piuttosto che solo l'orologio di sistema. Nel mio caso, tuttavia, non saremo in grado di utilizzare fopen in questo modo perché fondamentalmente stiamo lavorando in un ambiente sandboxed. – Travis

+1

UPDATE: Da [Windows Platform SDK Redistributable: CAPICOM] (http://www.microsoft.com/en-us/download/details.aspx?id=25281) - "CAPICOM è escluso da Windows SDK a partire dal Windows SDK per Windows 7 e sebbene il distribuibile venga eseguito su versioni a 32 bit di Windows 7 e sistemi operativi Windows Server 2008 R2, il suo utilizzo non è consigliato. Per ulteriori informazioni, vedere [Alternative all'utilizzo di CAPICOM] (http: // msdn.microsoft.com/en-us/library/windows/desktop/cc778518%28v=vs.85%29.aspx)" – Herbert