Generando una contraseña aleatoria; ¿Por qué no es esto portátil?

Quiero generar una contraseña aleatoria, y lo estoy haciendo así:

</dev/urandom tr -dc [:print:] | head -c 64 

En mi computadora portátil, que ejecuta Ubuntu, esto produce solo caracteres imprimibles, según lo previsto. Pero cuando entro al server de mi escuela, que ejecuta Red Hat Enterprise Linux, y lo ejecuto allí, obtengo salidas como 3!ri b GrӴ 1 H < oM & nMC[ Pb |L%MP 9 fL2q IFmsd|l K , que no funcionará en absoluto. ¿Qué podría estar yendo mal aquí?

Es tu problema local y tr .

Actualmente, GNU tr admite completamente solo caracteres de un solo byte. Por lo tanto, en las configuraciones regionales que usan codificaciones multibyte, la salida puede ser extraña:

 $ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64 ` pv   Z    c ox" O   % YR  F >  췔  ovȪ      ^,<H    > 

El shell imprimirá correctamente caracteres de varios bytes, pero GNU tr eliminará los bytes que cree que no se pueden imprimir.

Si desea que sea estable, debe establecer la configuration regional:

 $ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64 RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@ 

Considera en cambio

 $ dd if=/dev/urandom bs=48 count=1 status=none | base64 imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7 

Esto tiene dos ventajas:

  • Lees solo 48 bytes desde el dispositivo aleatorio, no ~ 8 KB; si otros processs en el mismo host necesitan numbers aleatorios, 8KB agotado todo a la vez puede ser un problema grave. (Sí, podría decirse que nadie debería estar usando el dispositivo aleatorio de locking , pero la gente ).

  • La salida de base64 casi no contiene caracteres con significados especiales. (Para ninguno, tack | tr +/ -_ al final, y (como en el ejemplo) asegúrese de que el número de bytes de input a base64 sea ​​un múltiplo de 3.)

Una contraseña generada de esta manera tiene exactamente 384 bits de entropía, que es algo menor que lo que estaba haciendo (log 2 96 64 y aproximadamente 421.4), pero más que suficiente para la mayoría de los propósitos (256 bits de entropía están seguros "aún adivinando cuándo el Sol quema el "territorio excepto las llaves RSA, AFAIK").

Otras personas ya han señalado que la configuration regional determina qué significa [:print:] . Sin embargo, no todos los caracteres imprimibles son adecuados para passwords (ni siquiera en ascii). ¿Realmente no quieres espacios, tabs y # $% ^? en su contraseña, no es solo difícil de recordar, también es potencialmente peligroso para el sistema de authentication subyacente, puede ser imposible ingresar en un campo de input, y así sucesivamente. En este caso, debe seleccionar manualmente los caracteres "cuerdos":

 LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64 

o simplemente

 </dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64 

O incluso mejor, use base64 como se sugiere en otras respuestas.

Qué pasa

 tr -dc [:print:] < /dev/urandom | head -c 64 | strings 

las cadenas deben imprimir la salida de urandom en un formatting imprimible

No sé si hay alguna razón por la que use /dev/random para generar la contraseña, pero le recomendaría que use pwgen para aliviar su dolor.

 $ pwgen -s 10 1 

Donde 10 es la longitud de la contraseña.

http://man.cx/pwgen

 #Chars allowed in password (I don't like l,o,O, etc): P="0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz" #Or such: #P="a-zA-Z0-9" head -c 8 < /dev/urandom | tr '\000-\377' "$P$P$P$P$P" echo 

Este método en mi humilde opinión es más inteligente cuando se consumen datos de / dev / urandom La cadena pegada como $ P $ P $ P … debe tener al less 256 caracteres de largo.

    Intereting Posts