Ante la actitud del Ministerio de Ignorancia...

null

sábado, 30 de enero de 2010

Generación de contraseñas seguras

Vía Mundo Geek veo las estadísiticas sobre seguridad de las contraseñas, que deja mucho que desear. Por eso, os planteo un método para obtener contraseñas seguras en GNU/Linux (lo que usa todo el mundo, ¿o aún queda alguien con Windows?).

Vamos a hacer uso de tres comandos: dd, bzip2 y base64, usando el generador de números aleatorios. Si sólo queremos generar una contraseña, podemos usar como generador /dev/random. Pero éste se agota si se automatiza la generación, dado que emplea diversas fuentes de entropía (para alimentar esas fuentes basta con mover el ratón). En cambio, /dev/urandom usa un generador independiente de las fuentes, mediante algoritmos. Aunque nunca se bloquea, es que es menos aleatorio.

Lo anterior lo pasamos por dd. A dd le especificamos como archivo de entrada (if=) /dev/random (o /dev/urandom), y no le especificamos salida, para que lo ponga listo para redirigir. Finalmente, le decimos que pase un tamaño (bs=) de 8 bytes, y que cuente este tamaño (count=) una vez. El comando resultante:
dd if=/dev/random bs=8 count=1
Por comodidad, redirigiremos la información de depuración (que sale por stderr) añadiremos 2>/dev/null, para redirigirla al agujero negro:
dd if=/dev/random bs=8 count=1 2>/dev/null

Después, usamos el algoritmo de compresión bzip2. Se podría usar gzip, pero los últimos bytes siempre son iguales tras pasarle base64. Los algoritmos de compresión se usan para reducir datos, pero en este caso vamos a ampliarlos, para pasarles otro filtro de entropía, más que nada, o si queremos un código más grande sin tener que forzar el generador. Sólo le pasaremos la opción -c, para que vuelva a pasar el archivo resultante a la salida estándar. Detectará automáticamente que el archivo de entrada viene de la redirección anterior.
dd if=/dev/random bs=8 count=1 2>/dev/null|bzip2 -c

Después, nos queda hacerlo imprimible (si hacéis tantos experimentos como yo sabréis lo que pasa al intentar pasar caracteres no imprimibles). Para ello usaremos base64, que nos devolverá un código formado por números, letras mayúsculas y minúsculas y caracteres no alfanuméricos (+ y /). Ya tenemos el comando generador:
dd if=/dev/random bs=8 count=1 2>/dev/null|bzip2 -c|base64

Opcionalmente, añadimos |tail -c 11 para sacar 10 caracteres (el salto de línea cuenta). Un par de resultados que esta orden ha dado en mi ordenador:
hIUteJHYA=
CQ6OUgkQ==
Mezclando tail -c numero y head -c numero podemos conseguir código más centrado, que es más aleatorio.

0 comentarios:

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.

1984

Sign by Danasoft - For Backgrounds and Layouts