La respuesta corta a esta pregunta es “herramientas de generación de números aleatorios“.
Y estoy seguro de que eres consciente de ello.
Quién iba a pensar que generar un número aleatorio iba a ser un lío, se supone que es tan sencillo como adivinar un número en cualquier lugar dentro de un rango dado.
Pero no es tan sencillo como parece y, además, hasta ahora se ha demostrado que todas las máquinas son incapaces de generar un verdadero número aleatorio por sí solas.
Pero para entender el uso de /dev/random
y /dev/urandom
, primero necesitas saber por qué la generación de números aleatorios es tan importante.
¿Por Qué es Crucial la Generación de Números Aleatorios?
Los ordenadores son máquinas que funcionan con un conjunto de instrucciones (por eso creamos programas para que funcionen).
¿Por qué es tan importante la generación de números aleatorios? La respuesta es sencilla.
Consideraciones de seguridad.
La mayoría de los algoritmos criptográficos se basan en la generación de números aleatorios, ya que estos números se utilizarán posteriormente para crear claves criptográficas.
Y si los números generados no son completamente aleatorios por naturaleza, esto hace que toda la técnica criptográfica sea débil.
Ya que estas claves pueden predecirse fácilmente.
Y ésta es la razón más importante para generar números aleatorios.
Entonces, ¿cómo resuelve Linux esta situación? Muy simple, este es el tema de discusión de hoy.
Usando /dev/random y /dev/random
Adivinaste bien.
Ambos se utilizan para generar números aleatorios.
Ambos se utilizan para proporcionar una interfaz al generador de números aleatorios a través del kernel.
El generador de números aleatorios recopilará datos aleatorios de fuentes externas, incluidos los controladores de dispositivos, en la reserva de entropía.
Pero hay una gran diferencia entre /dev/random y /dev/urandom ya que utilizan diferentes enfoques para generar números aleatorios.
Cómo /dev/random Generará Números Aleatorios
/dev/random sólo devolverá números aleatorios del grupo de entropía, y si la reserva de entropía está vacía o no indica suficiente aleatoriedad, la lectura a /dev/random se bloqueará.
Esto lo hace ideal para generar números aleatorios de alta calidad.
Cómo /dev/urandom Generará Números Aleatorios
urandom (unlimited random) también usará el grupo de entropía para devolver números aleatorios, pero si la reserva de entropía está vacía, generará datos usando SHA, MD5 o cualquier otro algoritmo.
Esto significa que a diferencia de /dev/random, no bloqueará las lecturas y continuará recibiendo números aleatorios incluso si la aleatoriedad es insuficiente.
/dev/random vs /dev/urandom ¿Cuál Elegir?
‘Random
‘ y ‘Urandom
‘ están diseñados para casos específicos.
Urandom se utiliza cuando hay una necesidad constante de números aleatorios y su aleatoriedad no es importante.
Mientras que ‘Random’ es adecuado para tareas en las que la seguridad es primordial, ya que bloquea la lectura si la aleatoriedad no es la adecuada.
Aunque la aleatoriedad de Urandom es ligeramente más débil que la de Random, se sigue utilizando en muchas operaciones, pero yo recomendaría utilizar Random (si insistes en la alta seguridad).
Generar Contraseñas y Números Aleatorios
Para generar una contraseña aleatoria usando Urandom, simplemente ejecuta el siguiente comando:
sudo < /dev/urandom tr -dc A-Za-z0-9 | head -c14; echo
En este ejemplo el comando tr
te permitirá filtrar la salida de /dev/urandom, por ejemplo contraseña A a Z, a a z y 0 a 9.
El comando head
generará una cadena de 14 caracteres (usando -c14
).
También puedes utilizar /dev/urandom para generar números pseudoaleatorios en la línea de comandos de la siguiente manera.
$ od -vAn -N4 -tu < /dev/urandom
696948885
Comandos como este que extraen datos de /dev/urandom y usan od
para procesarlos pueden generar números casi aleatorios. Ejecuta el mismo comando numerosas veces y verás que obtienes un rango de números.
$ od -vAn -N4 -tu < /dev/urandom
971369873
$ od -vAn -N4 -tu < /dev/urandom
3081534763
Dos de las opciones utilizadas con estos comandos son especialmente interesantes. La -N
controla el tamaño de la salida como el número en bytes.
Así, -N4
significa que el número resultante debe tener una longitud de cuatro bytes. Esto no significa que el número resultante proporcionado no pueda ser un número pequeño como 12, sino que utilizará cuatro bytes. Los números más grandes que verá tendrán diez dígitos.
Cambia a -N5
y obtendrás dos números-uno usando 4 bytes y otro usando 1. Omite la opción -N
y obtendrás un flujo continuo de números, al menos hasta que te canses de mirarlos y pulses ^C.
$ od -vAn -N5 -tu < /dev/urandom
1370663744 201
$ od -vAn -tu < /dev/urandom
1222525346 3506392510 3472603188 1731361957
2202786447 3697119376 4141031630 1771636374
2835108453 1141912700 3513537515 2700080425
2291283664 830745707 1850407474 2052151198
1838501000 3254638902 3844147685 737056947
413418805 4229695370 260761233 4174428697
1929587650 2498578944 3860492202 2975877960
4007230548 4282909881 190249485 240375398
3184078712 4061367705 3447111623 2020721032
Haz lo mismo con /dev/random y es probable que te quedes sin energía bastante rápido.
$ od -vAn -tu < /dev/random
1960047444 2394769128 2626630458 3266170581
81939044 3682833285 2506051389 3667483199
580011604 3171815130 973673575 1510995728
176467351 2427510176 952841361 426189676
3901860671 212220544 1487021468 2792287659
3256213045 4265044055 254517127 2761472422
3353827543 115407916 2122330268 3396355859
4123045776 3502427665 2506112394 1771015554
^Z
[1]+ Stopped od -vAn -tu < /dev/random
Ten en cuenta que la ^Z se utilizó para suspender el proceso cuando se colgó en la línea de comandos. También ten en cuenta que la reserva de entropía se agota y se regenera.
Resumiendo
En este artículo hemos mostrado los fundamentos de /dev/random y /dev/urandom, incluyendo la necesidad de aleatoriedad.
Espero que encuentres esta guía útil, y si tienes alguna pregunta, déjala saber en los comentarios.