Técnicamente, mejora la seguridad un poco, pero no tiene un final útil.
Los números aleatorios generalmente provienen de un generador de números pseudoaleatorios (PRNG) que a su vez se siembra con un valor aleatorio. El propósito del PRNG es estirar la semilla original para producir una salida muy larga. Los números aleatorios se suelen invocar por dos razones:
-
Para crear datos de apariencia aleatoria para un uso un tanto casual. Tal vez para dar a los personajes de un videojuego una estrategia de aspecto aleatorio, tal vez ejecutar un algoritmo aleatorio , etc. El requisito general es que los valores aleatorios están bien distribuidos y pasan pruebas estadísticas básicas, aunque el uso exacto determina exactamente cuáles son los requisitos.
-
Para proporcionar seguridad criptográfica. Quizás para generar una clave secreta, para iniciar la búsqueda de un número primo aleatorio, etc. El requisito es que los valores aleatorios estén muy bien distribuidos, pasen muchas pruebas estadísticas avanzadas, tengan un espacio semilla muy grande y no proporcionen información sobre otros valores en la salida o algo sobre la semilla del PRNG.
Los PRNG generalmente están diseñados para uno de esos requisitos y no se parecen en nada. Los PRNG para uso casual tienden a ser muy simples, extremadamente rápidos y no cumplen ninguno de los requisitos de un PRNG criptográfico. Es muy difícil convertir un PRNG simple en un PRNG criptográfico; para hacerlo, es probable que se parezca muy poco al PRNG original que queda en el esquema final de PRNG seguro.
Estos son algunos de los problemas con la combinación de PRNG débiles:
-
Duración del período. Cuando combina dos PRNG de forma lineal (como en el OP), en el mejor de los casos, combinará las longitudes de sus semillas. Los PRNG simples generalmente tienen 32 bits o menos de longitud de semilla, lo cual es criptográficamente muy inseguro. Por lo general, debe tener al menos 128 bits de espacio semilla.
-
Protección de semillas. La combinación de las salidas de PRNG no necesariamente evitará que la semilla se modifique mediante ingeniería inversa a partir de la salida de PRNG. Si un atacante puede derivar parte de la semilla, puede reducir su carga de trabajo drásticamente. Derivar la semilla de la salida de un PRNG simple a veces es trivial en circunstancias adecuadas.
-
Sesgo de salida. La combinación lineal de las salidas de PRNG no ocultará necesariamente sus salidas defectuosas. Definitivamente debería mejorar el sesgo, pero es poco probable que sean tan buenos como un PRNG criptográfico. (En la práctica, esto probablemente sea una preocupación menor, pero aún así vale la pena mencionarlo).
Y eso supone que siembras el PRNG correctamente. Aún debe hacer esa siembra de forma manual, ya que cualquiera que sea la siembra por defecto que utilizan los PRNG simples, probablemente se basa en algo de muy baja calidad, como una marca de tiempo.
El simple resumen es que la combinación de PRNG débiles proporciona una mejor seguridad, pero no el nivel de seguridad que debe esperar de un PRNG criptográficamente seguro. La solución es obtener un PRNG criptográfico real y sembrarlo con datos aleatorios de una buena fuente, como /dev/random
o CryptGenRandom()
. O simplemente puede usar la salida de esos directamente, ya que técnicamente son PRNG sembrados por otros datos aleatorios.
Si openssl_random_pseudo_bytes
establece el indicador que indica que no generó bytes aleatorios seguros, parecería que hay algún problema con el entorno porque los manuales sugieren que debería esperarse que regrese true
en condiciones normales. Compruebe para ver qué versión de PHP / OpenSSL está instalada y si puede actualizarla. Si no puede hacerlo funcionar, considere simplemente obtener sus datos aleatorios directamente de /dev/random
o CryptGenRandom()
.