Generar números aleatorios en bash parece simple de hacer usando el $RANDOM
variable, pero ¿es la variable verdaderamente tan aleatoria? Descubra qué puede estar impidiendo que genere números aleatorios de alta calidad, ¡y más!
Números aleatorios en la terminal
Parece simple generar un número aleatorio en Bash:
¿Pero el número es verdaderamente aleatorio?
Verdaderamente no, como podemos ver. El generador de números aleatorios en Bash depende de una semilla, un valor pasado a la función de generación de números aleatorios, que, siempre que la semilla sea la misma, siempre generará la misma secuencia de números aleatorios que muestra el resultado de ejemplo anterior.
Podemos inicializar el generador de números aleatorios con un valor semilla configurando el RANDOM
variable al valor de semilla deseado. Entonces, ¿tal vez podamos proporcionar un número aleatorio como semilla para el generador aleatorio?
Parece funcionar un poco, cada vez que queremos generar un número aleatorio, pre-sembramos el generador de números aleatorios con un número generado aleatoriamente. Pero todo lo que hicimos fue engañarnos a nosotros mismos por un tiempo; acabamos de crear una capa extra de profundidad, pero el resultado es casi el mismo; los números no son aleatorios y pueden verse influenciados por una semilla fija proporcionada previamente.
Este problema se denomina problema de generación de «entropía aleatoria». Cuanta más entropía podamos generar, mejores serán nuestros números aleatorios. Este problema en particular no se limita solo a Bash, existe en todos los sistemas informáticos básicos que intentan generar números aleatorios. Por tanto, el azar nunca es verdaderamente aleatorio. Algunos otros sistemas aleatorios usan, a modo de ejemplo, movimientos del mouse y pulsaciones del teclado y otros posts semi-aleatorias en combinación para incrementar la complejidad de la reserva de entropía aleatoria.
Entonces, ¿cómo podemos generar un número aleatorio «lo suficientemente bueno» para ser nombrado verdaderamente aleatorio?
Para esto, como fuente y semilla, necesitaríamos algo que sea verdaderamente, o casi verdaderamente, aleatorio. Podríamos pensar en utilizar la fecha de hoy, pero eso no es muy aleatorio, pensándolo bien. ¿Qué hay de los segundos desde las 00:00:00 UTC del 1 de enero de 1970 (de forma general llamado ‘época’ en los círculos de Linux)? Tal vez, pero todo lo que se necesita es un archivo de registro en algún lugar y la época se puede reconstruir.
Una mejor solución es utilizar los dígitos menos significativos del temporizador de precisión de nanosegundos:
En principio, inclusive esto no es perfecto. Puede caer bajo el encabezado de ‘mejor generación de números aleatorios’ según el título de este post, pero la entropía no es perfecta por definición. Veamos esto un poco más de cerca.
En el ejemplo, tomamos los bytes 4 a 9 o 6 números del tiempo de época, expresado por date +%N
y salida como consecuencia de la subcapa iniciada por $(...)
. Esto significa que nuestra semilla mínima es 0 y nuestra semilla máxima es 999999. Este es solo un rango de 1 millón de números.
En principio, este sistema aún podría ser ‘pirateado’: uno podría simplemente recorrer todos esos 1 millón de números y tomar las secuencias de números aleatorios generadas a partir de eso. ¡Ciertamente sería una solución muy pobre para la generación de una clave de cifrado, a modo de ejemplo!
Si seleccionamos menos números, el riesgo de que esto ocurra aumenta. Si seleccionamos más, el riesgo se reduce, pero la ‘semilla aleatoria’ además se torna menos aleatoria. Esto se puede ejemplificar incluyendo los segundos desde época:
¡Podemos ver que los segundos pasan! Tenga en cuenta las iniciales 6> 7> 8, etc.
Para fines de generación de números aleatorios estándar, a modo de ejemplo, en el software de prueba que varía su enfoque de prueba en función de una semilla aleatoria que se le proporciona, la respuesta basada en nanosegundos es suficiente / suficiente. Para otras soluciones que pueden necesitar números aleatorios de mejor calidad, es factible que se requiera una solución externa basada en hardware.
La verdadera generación de números aleatorios no es un asunto sencillo. Existen soluciones sustentadas en hardware que pueden acercarse o lograr una verdadera entropía aleatoria y / o generación de números aleatorios. Especialmente los dispositivos que no solo se centran en hardware pueden ser la clave para generar ese número aleatorio perfecto.