Generador de cadenas aleatorias en PHP: cómo funciona internamente

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Generador de cadenas aleatorias en PHP: cómo funciona internamente

\n\n

Todo desarrollador se ha enfrentado al menos una vez a la tarea de generar una cadena aleatoria. Para tokens, contraseñas temporales, IDs de sesión o simplemente datos de prueba. En PHP hay una docena de formas de hacerlo, pero ¿cuál es la correcta? Y lo más importante: ¿por qué?

\n\n

En Stack Overflow, la pregunta «PHP random string generator» ha acumulado miles de visitas y cientos de respuestas. Pero la mayoría son solo fragmentos de código sin explicación. Hoy vamos a mirar bajo el capó de PHP y entender cómo funcionan realmente los generadores de cadenas aleatorias, en qué se diferencia rand() de random_int() y por qué tu «contraseña aleatoria» podría no ser tan aleatoria.

\n\n

¿Qué es la «aleatoriedad» en PHP?

\n\n

En programación, la aleatoriedad se divide en dos tipos: pseudoaleatoriedad y aleatoriedad criptográfica. La diferencia es como la que hay entre un dado y una calculadora predecible.

\n\n

Los números pseudoaleatorios (PRNG) se generan mediante un algoritmo basado en una semilla inicial (seed). Si conoces la semilla, conoces toda la secuencia. Para tareas simples (aleatorizar colores en diseño, datos de prueba) esto es suficiente. Pero para tokens de autenticación y contraseñas, es un desastre.

\n\n

PHP ofrece varias funciones, y cada una representa un nivel diferente de «aleatoriedad»:

\n\n
    \n
  • rand() — PRNG clásico, rápido pero predecible
  • \n
  • mt_rand() — algoritmo mejorado Mersenne Twister, más rápido y con mayor período
  • \n
  • random_int() y random_bytes() — generadores criptográficamente seguros (PHP 7+)
  • \n
  • openssl_random_pseudo_bytes() — otra opción criptográfica
  • \n
\n\n

¿Cómo funciona el fragmento más popular?

\n\n

Este es el código clásico que circula por internet:

\n\n
<?php\nfunction generateRandomString($length = 10) {\n    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    $charactersLength = strlen($characters);\n    $randomString = '';\n    for ($i = 0; $i < $length; $i++) {\n        $randomString .= $characters[rand(0, $charactersLength - 1)];\n    }\n    return $randomString;\n}\n?>
\n\n

A primera vista, todo parece lógico. Tomamos una cadena con caracteres, seleccionamos un índice al azar y repetimos. Pero analicemos qué sucede realmente aquí.

\n\n

Problema #1: rand() y su semilla

\n\n

La función rand() en PHP utiliza por defecto el algoritmo Linear Congruential Generator (LCG). Es uno de los métodos más antiguos y predecibles. Si no llamas a srand() con una semilla aleatoria, PHP inicializa automáticamente el generador con la hora actual (en microsegundos).

\n\n

Conociendo la hora exacta de ejecución del script (por ejemplo, desde los logs del servidor), un atacante puede reproducir toda la secuencia de rand(). Para un token de restablecimiento de contraseña, esto es una puerta abierta al hackeo.

\n\n

Problema #2: Sesgo de probabilidad (Bias)

\n\n

Incluso sin pensar en seguridad, hay un problema matemático. Imagina que usas rand(0, 61) (62 caracteres en la cadena). PHP internamente usa un rango de 0 a getrandmax() (generalmente 2147483647). 2147483647 no es divisible exactamente por 62. El resto de la división es 31. Esto significa que los primeros 31 números del rango tienen una probabilidad ligeramente mayor de aparecer que el resto.

\n\n

En la práctica, la diferencia es mínima, pero si necesitas una cadena aleatoria con distribución uniforme, rand() no es la mejor opción. random_int() resuelve este problema utilizando un algoritmo que garantiza una distribución uniforme.

\n\n

Generador criptográfico: ¿qué hay bajo el capó?

\n\n

En PHP 7 aparecieron las funciones random_int() y random_bytes(). Estas utilizan la fuente de entropía del sistema:

\n\n
    \

Blogs

Book Recommendations