Gerando uma senha aleatória; Por que isso não é portátil?

21

Eu quero gerar uma senha aleatória e estou fazendo assim:

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

No meu laptop, que roda o Ubuntu, isso produz apenas caracteres imprimíveis, como pretendido. Mas quando eu ssh no servidor da minha escola, que roda o Red Hat Enterprise Linux, e o executo lá, recebo saídas como 3!ri�b�GrӴ��1�H�<�oM����&�nMC[�Pb�|L%MP�����9��fL2q���IFmsd|l�K , o que não faz nada. O que pode estar errado aqui?

    
por Taymon 02.02.2015 / 03:50

6 respostas

34

localidade e tr problema.

Atualmente, o GNU tr suporta totalmente somente caracteres de byte único. Então em locales usando codificações multibyte, a saída pode ser estranha:

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

O shell irá imprimir caracteres multi-byte corretamente, mas o GNU tr removerá os bytes que ele considera imprimíveis.

Se você quer que ele seja estável, você deve definir a localidade:

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

Considere em vez disso

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

Isso tem duas vantagens:

  • Você lê apenas 48 bytes do dispositivo aleatório, não ~ 8KB; se outros processos no mesmo host precisarem de números aleatórios, 8KB drenados todos de uma vez podem ser um problema sério. (Sim, sem dúvida ninguém deveria estar usando o dispositivo aleatório blocking , mas as pessoas fazem .)

  • A saída de base64 quase não contém caracteres com significados especiais. (Para nada, coloque | tr +/ -_ no final e (como no exemplo) certifique-se de que o número de bytes entrada para base64 seja um múltiplo de 3.)

Uma senha gerada dessa maneira tem exatamente 384 bits de entropia, o que é um pouco menor do que o que você estava fazendo (log 2 96 64 aproximadamente 421,4), mas mais do que suficiente para a maioria dos propósitos (256 bits de entropia estão em segurança em "ainda adivinhando quando o Sol queima" o território exceto para chaves RSA, AFAIK).

    
por 02.02.2015 / 16:13
3

Outras pessoas já apontaram que o local determina o que [:print:] significa. No entanto, nem todos os caracteres imprimíveis são adequados para senhas (nem mesmo em ascii). Você realmente não quer espaços, abas e # $% ^? na sua senha - não é apenas difícil lembrar, também é potencialmente perigoso para o sistema de autenticação subjacente, pode ser impossível entrar em um campo de entrada e assim por diante. Nesse caso, você deve selecionar manualmente os caracteres "sane":

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

ou simplesmente

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

Ou melhor ainda, use base64 como sugerido em outras respostas.

    
por 02.02.2015 / 14:38
2

E sobre

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

seqüências de caracteres devem imprimir a saída da urandom em um formato imprimível

    
por 02.02.2015 / 12:28
2

Não sei se existe alguma razão pela qual você usa /dev/random para gerar a senha, mas eu recomendo que você use o pwgen para aliviar sua dor.

$ pwgen -s 10 1

Onde 10 é o tamanho da senha.

link

    
por 03.02.2015 / 07:01
1
#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 '
#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 '%pre%0-7' "$P$P$P$P$P"
echo
0-7' "$P$P$P$P$P" echo

Este método IMHO é mais inteligente quando consome dados de / dev / urandom A string colada como $ P $ P $ P ... deve ter pelo menos 256 caracteres.

    
por 21.07.2017 / 20:14