Eu gostaria de gerar uma sequência aleatória (por exemplo, senhas, nomes de usuário etc.). Deve ser possível especificar o comprimento necessário (por exemplo, 13 caracteres).
Quais ferramentas posso usar?
(Por motivos de segurança e privacidade, é preferível que as strings sejam geradas off-line, em vez de on-line em um site.)
apg
pessoalmente).apg
para gerar uma sequência aleatória./dev/urandom
). Seria bom ter algumas respostas usando verdadeiros geradores de números aleatórios, com base em, por exemplo, random.org .Respostas:
Minha maneira favorita de fazer isso é usando
/dev/urandom
junto comtr
para excluir caracteres indesejados. Por exemplo, para obter apenas dígitos e letras:Como alternativa, para incluir mais caracteres da lista de caracteres especiais da senha do OWASP :
Se você tiver algum problema com a
tr
reclamação sobre a entrada, tente adicionarLC_ALL=C
assim:fonte
head /dev/urandom | tr -dc A-Za-z0-9 | head -c10
- Desta forma, é mais preciso. Você obtém 10 caracteres com letras maiúsculas, redutores ou dígitoshead
comando pode ser problemático. Ele produzirá as 10 primeiras linhas a partir de/dev/urandom
, o que significa que será interrompido depois de ver a 10ª nova linha. Portanto, o comprimento da saída enviada para otr
comando é aleatório. É possível que haja menos de 13 caracteres na saída detr
. Não calculei a probabilidade disso acontecer, os cálculos são um pouco complicados.<dev/urandom tr -dc "$charset" | head -c "$length"
tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
tr ..
comando, mas apenas citar tudo (exceto as aspas simples) funciona -tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'
.Para gerar uma senha aleatória, você pode usar
pwgen
:Gere 7 senhas de comprimento 13:
Conforme mencionado nos comentários, você pode evitar reduzir a entropia usando o
-s
argumento (ou seja, gerar senhas mais seguras, completamente aleatórias, mas difíceis de lembrar):Para gerar nomes de usuário aleatórios, você pode usar
gpw
:Gere 7 senhas (nomes de usuário) de comprimento 13:
fonte
pwgen -s
.Estou usando o
openssl
comando, o canivete suíço da criptografia.ou
fonte
rand -hex
limitará a saída a apenas 16 caracteres, em vez dos mais de 90 no meu teclado. base64 é melhor porque tem 64 caracteres, mas não é aleatório (por exemplo, existem padrões de preenchimento previsíveis e talvez alguns caracteres apareçam com mais frequência do que outros).openssl rand -base64 12
produz 16 caracteres de saída (porque 256 valores são mapeados para 64). E o exemplo hexadecimal produz 24 caracteres. Não há perda no caso do hexadecimal, pois é um mapeamento simples 1: 2, mas pode haver um pouco no caso base64 desde que o preenchimento seja usado. O radical não afeta a aleatoriedade, é o modo como um é mapeado para outro que afeta. (e a contagem total de bits é muito mais importante).Aqui está como, eu faço. Ele gera uma sequência aleatória de 10 caracteres. Você pode otimizá-lo substituindo a "dobra" por outras ferramentas de processamento de string.
fonte
/dev/urandom
de, é claroPara gerar uma senha com a maior entropia possível, com as ferramentas padrão do Linux, integradas a todas as distribuições que eu uso:
Isso gera todos os caracteres imprimíveis ASCII - de 32 (espaço) a 126 (til
~
). O comprimento da senha pode ser controlado com ohead
's-c
bandeira. Também existem outros conjuntos de caracteres possíveistr
(para não incluir o espaço, apenas os caracteres 33-126, use[:graph:]
).fonte
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echo
se você não quiser` characters in generated string.
`porque é um caractere de escape em muitas línguas causa problemas< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echo
excluir | \ / `e espaçoDependendo do nível de aleatoriedade que você deseja, você pode simplesmente usar a variável interna do bash (também
zsh
eksh
, possivelmente outras)$RANDOM
:Os métodos de leitura direta
/dev/urandom
são muito mais simples, mas para fins de conclusão, você também pode usar$RANDOM
:Importante : esta solução produzirá apenas seqüências aleatórias usando as 10 primeiras letras do alfabeto. Se isso é suficiente ou não, depende do que você precisa.
fonte
$RANDOM
imprimirá um número entre 0 e 32767.rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)
.Inspirado por Pablo Repetto, acabei com esta solução fácil de lembrar :
-z evita saída de várias linhas
-e ecoar o resultado
-r permite que qualquer caractere apareça várias vezes
-n20 sequência aleatória com um comprimento de 20 caracteres
{A..Z} {a..z} {0..9} permitiram classes de caracteres
shuf
faz parte dos linux coreutils e está amplamente disponível ou, pelo menos, foi portado.fonte
A @Brandin explicou em um comentário para outra resposta como obter no máximo 100 bytes de
/dev/urandom
usohead -c 100
. Outra maneira de fazer isso é comdd
:O
2>/dev/null
final dodd
comando é suprimir a saída "... records in / ... records out".Não conheço vantagens / desvantagens substanciais entre esses dois métodos.
Eu tive um problema com os dois métodos de
tr
reclamação sobre a entrada. Eu pensei que era porque não gostava de receber entrada binária e, portanto, sugeri a primeira filtragem/dev/random
comiconv -c -t US
. No entanto, Gilles sugeriu um diagnóstico e uma solução diferentes, que funcionam para mim:fonte
iconv
solução maxes um núcleo da CPU e não produz uma saída (I esperou alguns 10s antes de matá-lo) ...libc-bin
2.19. Não tenho certeza se é o mesmo iconv ...tr
suporta entrada binária. No entanto, um intervalo como esseA-Z
pode ser influenciado pelas configurações de localidade. TenteLC_ALL=C tr …
tr
suporta porque não suporta multibyte (por exemplo, da última vez que verifiquei que a mudança de caso foi implementada simplesmente configurando o sexto bit de cada byte). Outros sistemas (por exemplo, BSD) suportam multibyte e isso falhará, pois a chance de um fluxo de entrada aleatório também ser um fluxo válido de multibyte é muito pequena na maioria das codificações. O GNU pode adicionar suporte multibyte a qualquer momento, momento em que isso falhará. Obviamente, a configuraçãoLC_ALL=C
corrigirá isso.tr
processamento de entrada binária (no código de idioma C). (Bem, ok, ele diz apenas explicitamente que bytes nulos devem ser suportados, não diz que arquivos não vazios que não terminam com um caractere de nova linha devem ser suportados, mas na prática esse sempre é o caso também.)APG
é incluído por padrão em algumas distribuições Linux.Para gerar senhas de tamanho 5 a 10 nos subconjuntos Especial, Numérico, Capital e Menor, o comando é:
E retorna
Como dito por @landroni no comentário.
fonte
apg -a1 -m14
Você pode usar uma das
md5
ferramentas que tem exatamente esse objetivo. No caso de criar uma senha completamente aleatória, você pode usar omd5pass
. É uma ferramenta muito simples de usar e muito útil, já que você pode usar "texto normal" junto com um "salt" para dar um salto na construção da mesma senha que você pode recuperar posteriormente ou, alternativamente, você pode querer obter uma descrição completa. senha aleatória o tempo todo. O uso geral é:onde
password
é uma palavra escolhida que será usada para a construção da sequência aleatória esalt
é o salto em bytes a ser usado. Como isso:Isso criará uma senha de "uma sequência aleatória" para você usar. Se você usar não
salt
, poderá não conseguir recriar essa mesma sequência posteriormente.No entanto, se você usar um
salt
como este:em seguida, você pode criar uma sequência que poderá recuperar se usar a palavra em conjunto com o mesmo sal (ou salto) se foi originalmente definida.
fonte
salt
está sendo usado, isso soa semelhante à abordagem PasswordMaker ...Use o
xxd
comando para especificar o comprimento (via -l), que funciona no Linux e no SO. https://www.howtoforge.com/linux-xxd-command/fonte
Esses dois comandos geram senhas e senhas aleatórias, respectivamente.
O gerador de senhas requer um arquivo com caracteres contendo todos os caracteres que você deseja que a senha use, um caractere por linha e exatamente uma vez cada. O arquivo não deve conter linhas em branco e as linhas devem ser terminadas com nova linha.
O gerador de frase secreta requer um arquivo com palavras contendo todas as palavras que você deseja que a frase secreta use, uma palavra por linha e exatamente uma vez cada. O arquivo não deve conter linhas em branco e as linhas devem ser terminadas com nova linha.
A opção --head-count especifica o tamanho da senha - em caracteres - ou senha - em palavras.
fonte
Descobri que canalizar / dev / urandom para tr no macOS não funcionou. Aqui está outra maneira:
fonte
Eu uso:
base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44
Isso me dá 57 caracteres possíveis. A sequência pode ser copiada e colada (removida
+
e\
) ou impressa e redigitada conforme os caracteres difíceis de distinguir (I1lO0
) foram removidos.Eu gosto disso porque:
Agradeço a https://unix.stackexchange.com/a/230676/9583 e, especialmente, os comentários para minha inspiração inicial.
fonte
1
sem reduzir a entropia (ao gerar um novo para obter um w / um número faz reduzir a entropia). Você também pode anexar com segurança um!
sem reduzir a entropia. Nenhum esquema aumenta a entropia que vale nada, mas pode colocar a sequência gerada em conformidade com os requisitos de senha mais antigos.A filosofia do Unix de "muitas pequenas ferramentas que fazem uma coisa bem" serve muito bem nesse caso.
/dev/urandom
é um fluxo de "bytes" aleatórios (que incluem caracteres não imprimíveis)base64
codifica dados de bytes em[A-Za-z0-9/+]
(que é totalmente imprimível)dd
copia entrada para saída aplicando modificadores dados como argumentos (que podem incluir tamanho e contagem de blocos)OSX
Linux
Notas:
tr -d '[A-Z/+]'
para se livrar de letras maiúsculas e+
e/
bs
(tamanho do bloco) para o tamanho que precisar.base64
agrupa 76 colunas por padrão e deve ser redefinida com-w0
menos que você queira.fonte
Eu gostaria de contribuir com meu comando usual para gerar uma senha
Para configurar o comprimento da senha, altere o número no comando recortar para o comprimento necessário, por exemplo, 24 caracteres
Não quer confundir 0 ou O, 1 ou l? Filtre-o com outro
tr
Pessoalmente, nunca prefiro caracteres especiais na senha, é por isso que só escolho o
[:alnum:]
meu gerador de senhasfonte
Eu mantenho
secpwgen
no Alpine Linux e mantenho as fontes no meu Github .Pode produzir seqüências aleatórias ou frases de diceware:
Para gerar uma sequência aleatória de 13 caracteres, você usaria:
Para que os usuários se lembrem de uma senha, use as frases de diceware:
Eu pessoalmente gosto de:
fonte
Meu caminho para uma senha muito segura (onde 16 é o comprimento pw):
Resultado de exemplo:
Ou, alternativamente, para gerar várias senhas:
cat / dev / urandom | tr -cd [: gráfico:] | dobra -w 16 | cabeça -6
Resultado de exemplo:
Pouco menos seguro (conjunto de caracteres menor):
Resultado de exemplo:
fonte
Uma maneira super fácil e simples (provavelmente mais simples do que você procura) de conseguir isso seria gerar um número aleatório em um determinado intervalo, converter esse número em seu caractere ASCII equivalente e anexá-lo ao final de uma string .
Aqui está um exemplo básico em Python:
EDIT: comentários adicionados e código adicionado para gerar várias senhas e gravá-las em um arquivo
fonte
Eu gostaria deste comando:
fonte
date +%N
como se você gerar muitos usuários e senhas em um script, os segundos podem se tornar iguais para muitos ou mesmo para todos os comandos de data, produzindo senhas idênticas.dd if=/dev/random bs=512 count=1
:?Eu vou, para http://passwordsgenerator.net/ , permite gerar seqüências de caracteres aleatórios de até 2048 caracteres, selecionando maiúsculas, minúsculas, dígitos de 0 a 9, sinais de pontuação ou qualquer combinação.
fonte