2009-10-11 14 views
6

Duplicar posible:
Secure random number generation in PHP¿Cómo se generan números aleatorios criptográficamente seguros con PHP?

Necesitamos generar una cadena aleatoria criptográficamente para su uso como un token de autenticación, que se ata a los datos de sesión en la base de datos. Estamos usando PHP, que no parece tener un generador de números aleatorios adecuado. ¿Cómo podemos generar una cadena aleatoria criptográficamente segura de N longitud usando php?

También tenga en cuenta que, debido a la naturaleza de nuestra aplicación, shell_exec está fuera de la mesa.

+0

Encuentra la respuesta aquí: http://stackoverflow.com/questions/1182584/secure-random-number-generation-in-php –

Respuesta

-6

¿qué hay de uniqid? los documentos tienen un ejemplo de cómo puede usarse para cookies/sesiones.

+0

Este parece ser el mejor enfoque - cuando se combina con mt_rand como se describe en el manual. – Travis

+7

uniqid no es criptográficamente seguro, está diseñado específicamente para nunca devolver el mismo número dos veces, ya que está basado en el reloj del sistema, pero tiene una entropía bastante baja si solo un atacante sabe aproximadamente cuándo se generó. – aaaaaaaaaaaa

+0

@ebusiness: OP no necesita realmente una función criptográficamente segura. y 'uniqid' es perfecto para su caso. – SilentGhost

-4

Fuera de la cabeza: tómate el micro tiempo, multiplícalo por microtime% 100 y haz algunos randoms en sha1 del resultado recibido.

+5

Eso no será muy seguro. No use el reloj del sistema a menos que desee que la salida sea predecible. –

+0

Dan tiene razón. Donde la seguridad es importante, las semillas basadas en el tiempo actual no ofrecen suficiente entropía. – christophe

4

Según su plataforma, puede usar/dev/urandom o CAPICOM. Esto está muy bien resumida en this comment from Mark Seecof:

"Si necesitas algunos bits pseudoaleatorios para la seguridad o propósitos criptográficos (huevo, IV aleatorio para cifrado de bloques, sal al azar para hash de la contraseña) mt_rand() es una fuente pobre En la mayoría. plataformas Unix/Linux y/o MS-Windows, puede obtener una mejor calificación de bits pseudoaleatorios de la biblioteca OS o sistema, así:

<?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: por lo general es seguro dejar tanto el intento de leer/dev/urandom y el intento de acceder a CAPICOM en su código, aunque cada uno fallará silenciosamente en la plataforma del otro. Déjelos allí para que su código sea más portátil ".

+0

Gracias - Creo que esta es la mejor manera, ya que/dev/urandom usa una variedad de fuentes de entropía, en lugar de solo el reloj del sistema. En mi caso, sin embargo, no podremos usar fopen de esta manera porque básicamente estamos trabajando en un entorno de espacio aislado. – Travis

+1

ACTUALIZACIÓN: desde [Windows Platform SDK redistribuible: CAPICOM] (http://www.microsoft.com/en-us/download/details.aspx?id=25281) - "CAPICOM está excluido del SDK de Windows que comienza con el Windows SDK para Windows 7, y aunque la distribución se ejecutará en versiones de 32 bits de los sistemas operativos Windows 7 y Windows Server 2008 R2, no se recomienda su uso. Para obtener más información, consulte [Alternativas al uso de CAPICOM] (http: // msdn.microsoft.com/en-us/library/windows/desktop/cc778518%28v=vs.85%29.aspx) " – Herbert