Entropía aleatoria en Bash

Entropía aleatoria en Bash

Al usar números aleatorios en Bash, la cuestión de la entropía aleatoria tarde o temprano aparecerá. Este artículo lo ayudará a comprender qué es la entropía, cómo se puede modificar y optimizar en Bash, y cómo afectará la generación de números aleatorios.

En este tutorial aprenderás:

  • Cómo generar entropía aleatoria en Bash
  • Cómo pre-sembrar el generador de números aleatorios en Bash
  • Ejemplos que demuestran la generación de entropía aleatoria en Bash
Entropía aleatoria en Bash

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Convenciones # - requiere que los comandos de Linux se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux se ejecuten como un usuario regular no privilegiado

Ejemplo 1: aleatorio o no tan aleatorio?

Podemos generar fácilmente un número aleatorio en Bash:

$ Echo $ Random 13 


Sin embargo, aunque este número parece aleatorio, de hecho no lo es, o en el mejor de los casos pseudo-aleatorio. Esto se debe a que una computadora en sí misma nunca puede ser verdaderamente aleatoria, y el generador de números aleatorios en bash se sembra precipitado con un valor, lo que determina todas las llamadas posteriores de la $ Random variable/función.

Pre-sembremos el generador de números aleatorios de diferentes maneras. Comenzaremos pre-siete el generador aleatorio con la semilla '1' estableciendo ALEATORIO a 1:

$ echo $ aleatorio 25552 $ random = 1 $ echo $ random 16807 $ random = 1 $ echo $ random 16807 $ echo $ random 15089 $ random = 1 $ echo $ random 16807 $ echo $ random 15089 $ aleator = a $ echo $ aleator 20034 

Tenga en cuenta que el 16807 y llamado secundario 15089 Los resultados siguen siendo los mismos, mientras que el generador aleatorio se sembró previamente con 1. Cambia cuando se sembra previamente con a.

Mientras el $ Random La variable en Bash siempre producirá un número aleatorio generado por el generador de números aleatorios BASH, también es una variable que, cuando se establece, pre-sembra el generador aleatorio. El desafío es que si la semilla es la misma, el resultado (y la secuencia!) también será el mismo, como puede ver al estudiar el ejemplo anterior.

La forma en que se inicializa el generador aleatorio en su sistema puede depender del sistema operativo Linux o UNIX en uso, hardware usado y configuración de configuración. Inmediatamente de acuerdo en que no es una forma muy segura de generar un número aleatorio verdadero/real, de ahí los términos pseudo-aleatorio y pseudo-aleatorio. Dicho esto, se puede hacer mucho para hacerlo (mucho) mejor.

Ejemplo 2: nuestro propio generador de entropía aleatoria

La única entrada que está disponible para el generador aleatorio es básicamente la semilla pasada a Aleatorio =. Entonces, ¿cómo podemos encontrar una semilla verdaderamente aleatoria para sembrar al generador aleatorio y crear entropía aleatoria real (entropía: la calidad de la falta de previsibilidad)? La entropía aleatoria es importante, especialmente en el campo de la seguridad informática.

Piense en esta pregunta; ¿Cómo puede proporcionar (para golpear) la entrada más aleatoria para usar como semilla para la generación de entropía aleatoria??

Creo que he encontrado una solución en el siguiente código:



$ fecha +%s%n 1593785871313595555 # | -------- | < Selected part indicated $ date +%s%N | cut -b10-19 4418322030 $ date +%s%N | cut -b10-19 4914627208 $ date +%s%N | cut -b10-19 5282934388 $ date +%s%N | cut -b10-19 5635463163 $ date +%s%N | cut -b10-19 5967700148 $ date +%s%N | cut -b10-19 6322917009 $ RANDOM=$(date +%s%N | cut -b10-19) $ echo $RANDOM 16349 $ RANDOM=$(date +%s%N | cut -b10-19) $ echo $RANDOM 9713 

El final 9713 El resultado es casi verdaderamente aleatorio.

fecha +%s%n es una combinación de %s que son los segundos desde 1970-01-01 00:00:00 UTC - Un número bastante único, pero sigue siendo algo que podría volver a calcular. Y %NORTE son nanosegundos. Luego cortamos la entrada para agarrar solo los últimos 10 dígitos.

Esto significa que estamos pasando el segundo (último 0-9 dígito) + el nanogundo exacto completo 000000000-999999999 al generador aleatorio como semilla. Esto sería tan bueno como imposible de reconstruir, a menos que capture el valor generado antes de asignarlo. Casi verdaderamente aleatorio.

Esto también significa que puede obtener un número semi-aleatorio de dígitos X simplemente seleccionando la parte más granular del microsegundo:

fecha +%s%n | corte -B19-19 fecha +%s%n | corte -B18-19 fecha +%s%n | Cortar -B17-19 

El primer comando producirá 1 dígito, el segundo 2 dígitos, etc.

Sin embargo, cuanto más tiempo tu cortar Slice se convierte (al aumentar el cortar Longitud), cuanto menos pseudo-aleatorio sea el número, especialmente una vez que se corte en la parte de los segundos. También podrías dejar el %s, y reduzca el tamaño de corte para tener una llamada del sistema menos intensiva. Si bien puede no importar una sola llamada de $ Random, importaría si se llamara cientos de miles de veces.

Conclusión

En este artículo, vimos cómo generar entropía aleatoria, de una manera razonablemente aleatoria. Si bien ningún generador de entropía aleatoria es perfecto (y por lo tanto, cualquier número aleatorio resultante de él), llegamos a llamar a la hora de nanosegundos. También vimos cómo la variable de entropía del generador aleatoria con una semilla específica producirá los mismos resultados siempre que se genere un número aleatorio utilizando el $ Random variable.

Actualice sus scripts con nuestro inicializador de entropía aleatoria o háganos saber si descubrió uno mejor en los comentarios a continuación. ¿Quién más está interesado en una mejor entropía??!

Disfrutar!

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Mastering Bash Script Loops
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Cómo configurar un servidor OpenVPN en Ubuntu 20.04
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Bucles anidados en guiones Bash
  • Descarga de Linux
  • ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..