¿Puedo confiar en que openssl_random_pseudo_bytes () sea muy aleatorio en PHP?

6

Encontré una aplicación que necesita generar un token aleatorio para cada usuario. Es muy importante que cada token generado sea único. El código de solicitud fue el siguiente:

$token = md5(open_ssl_random_pseudo_bytes(64));

No sé exactamente cómo funciona open_ssl_random_pseudo_bytes o por qué se eligió el número "64", ni cómo se juegan esos bytes junto con el hashing MD5.

Entonces, ¿qué tan aleatorio es este token realmente? Si el código se ejecuta mil millones de veces, ¿serán los tokens únicos?

    
pregunta Boring person 25.09.2015 - 13:04
fuente

3 respuestas

8

open_ssl_random_pseudo_bytes es un generador de números pseudo aleatorios seguro criptográficamente (CSPRNG) .

En términos sencillos, esto significa que puede generar una secuencia impredecible y distribuida uniformemente, que es adecuada para la generación de claves. La propiedad impredecible es importante, porque incluso si se conoce el estado completo del generador de números aleatorios, un atacante no puede recrear las secuencias generadas previamente, y no es factible que un observador externo adivine el estado para predecir secuencias futuras.

Esto contrasta con un generador de números aleatorios que toma su semilla del número de segundos pasados la medianoche y luego genera secuencias predecibles basadas en esta semilla. En este caso, un atacante puede simplemente configurar su propio sistema para generar números utilizando la misma semilla y puede adivinar de manera efectiva los valores de token para usarlos para sus propios propósitos nefarios.

64 bytes le darán 512 bits de entropía. Como MD5 genera hashes de 128 bits, no hay ninguna ventaja de que la entropía generada sea mayor que 128. Si el código se ejecuta mil millones de veces, existe una posibilidad estadísticamente probable de que siempre sea único porque tiene un espacio de teclas de salida de 2 128 (3.4 * 10 38 ). La tasa de colisión de MD5 es aproximadamente 2 64 que es aproximadamente 18 billones de billones.

    
respondido por el SilverlightFox 25.09.2015 - 13:28
fuente
7

Debes conocer error de PHP # 70014 que es bastante reciente y afecta la confiabilidad de openssl_random_pseudo_bytes() .

He estado trabajando en paragonie / random_compat , que respalda random_bytes() de PHP 7 a PHP 5. Uno de los los fallbacks que soporta son openssl_random_pseudo_bytes() , pero si puede leer directamente de /dev/urandom preferirá eso en su lugar.

    
respondido por el Scott Arciszewski 07.10.2015 - 09:05
fuente
0

Hay otro error con openssl_random_pseudo_bytes ( 71915 ), que puede resultar en valores duplicados cuando lo ejecutas Varias veces con el mismo ID de proceso. Parece que está arreglado en 5.6.24.

    
respondido por el JW. 12.12.2016 - 19:07
fuente

Lea otras preguntas en las etiquetas