O que é um bom one-liner para gerar uma senha fácil de memorizar, como o grampo de bateria de cavalo correto do xkcd ou uma semente de Bitcoin?
EDIÇÃO 1 :
Isso não é o mesmo que gerar uma string aleatória, pois as strings aleatórias não são memoráveis. Compare com o xkcd obrigatório ...
Antes de tudo, instale um dicionário de um idioma com o qual você esteja familiarizado, usando:
Para ver todos os pacotes disponíveis:
Nota: todas as instruções de instalação assumem que você está em um sistema operacional baseado em debian.
Depois de instalar o dicionário, execute:
Que irá produzir ex:
Para decompô-lo:
WORDS=5;
— escolha quantas palavras você quer na sua senha.LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words
— escolha apenas palavras que contenham caracteres alfabéticos minúsculos (exclui palavras com'
eles ou caracteres estranhos como eméclair
).LC_ALL=C
garante que[a-z]
no regex não corresponda símbolos semelhantes a letras que não sejam letras minúsculas sem diacríticos.shuf --random-source=/dev/urandom -n ${WORDS}
— escolha quantas PALAVRAS você solicitou.--random-source=/dev/urandom
garante queshuf
semeia seu gerador aleatório de forma segura; sem ele, oshuf
padrão é uma semente segura, mas pode retornar a uma semente não segura em alguns sistemas, como algumas camadas de emulação Unix no Windows.paste -sd "-"
— junte todas as palavras usando-
(sinta-se à vontade para mudar o símbolo para outra coisa).Alternativamente, você pode envolvê-lo em uma função:
ou
Ambos podem ser chamados assim:
Retornando:
Bônus
Para uma senha nerd e divertida, mas não muito segura, que não requer instalação de dicionário, você pode usar (cortesia de @jpa):
Eu não faço isso com utilitários padrão que não são projetados com o uso criptográfico em mente. Não há razão para acreditar que eles estão usando um csPRNG ou que o estão propagando corretamente, e alguém que conheça seu método poderá reproduzir suas senhas. Da mesma forma, comporte-se de utilitários multifuncionais se você não tiver certeza de como usá-los corretamente.
pwqgen
depasswdqc
.Você precisa de um dicionário de lista de palavras, já que você menciona bitcoin, provavelmente você quer este:
https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Se seu idioma nativo não for o inglês, existem listas de palavras para outros idiomas disponíveis no mesmo repositório.
Dado este arquivo english.txt, você pode fazer uma seleção aleatória com
shuf
:Observe que você precisará de muito mais do que apenas 4 palavras para uma senha verdadeiramente segura. 4 palavras é para um serviço online onde o número de tentativas que um invasor pode fazer é muito limitado. Acho que a recomendação de bitcoin é de 16 palavras, não tenho certeza.
Também neste exemplo, cada palavra pode aparecer apenas uma vez. Se você deseja permitir palavras repetidas, adicione a
--repeat
opção:Isso permitiria que cada palavra aparecesse mais de uma vez.
Se você quiser a saída em uma linha, basta adicionar
xargs echo
:Ou se preferir substituição de comando:
Em uma nota lateral, não acho esse estilo de senha fácil de memorizar.
Bem, na verdade eu tive muita sorte,
math easily cube daughter
já que isso simplesmente torna mais fácil pensar em uma história em que sua filha pode facilmente fazer matemática com cubos ou qualquer outra coisa. É algo com o qual os humanos podem se relacionar, assim como o cavalo no exemplo do XKCD.Mas o que diabos é um
anchor neck trumpet response
? Não sou um autor de quadrinhos com criatividade de sobra para inventar um mnemônico para isso. Assim, será esquecido em pouco tempo.Mesmo que você consiga lembrar as palavras, é difícil lembrar sua ordem correta. Foi
math easily cube daughter
oudaugher easily math cube
ou outra coisa?E a senha deve ser aleatória, você não tem permissão para selecioná-la e modificá-la.
Quanto às sementes de bitcoin, você não deveria se lembrar delas. Esta é apenas uma maneira de poder escrevê-lo facilmente. Qualquer um pode escrever 16 palavras em um pedaço de papel e lê-las corretamente; com letras aleatórias é muito mais provável cometer erros.
Se você tiver dúvidas sobre a aleatoriedade de
shuf
, adicione o--random-source=/dev/urandom
parâmetro a todos osshuf
comandos.Veja também https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources
Eu tenho isto:
Tente isso,
Saída :
Explicação :
shuf --random-source=/dev/urandom -n5 /usr/share/dict/words
Obtenha 5 palavras aleatórias do arquivo dictsed 's/[^[:alnum:]]//g'
Remover caracteres não alfanuméricospaste -sd_
, junte as palavras com sublinhado (_
)Você pode usar qualquer arquivo de lista de palavras da Internet em vez de
/usr/share/dict/words
.Instale a lista de palavras se você não tiver. Pode estar em seu repositório de distros, por exemplo https://packages.debian.org/sid/wordlist :
Como sugerido por @R.. mas para máquinas RHEL/CentOS (disponível no repositório EPEL):
Observe este trecho da página de manual do pwgen (ênfase minha):
Se você quiser que seja ainda mais fácil de memorizar, você também pode usar a abordagem de hash de senha (lembre-se de uma única senha para gerar muitas outras senhas). Em vez de memorizar centenas de senhas, você apenas memoriza o método para gerá-las.
Usando
shuf
withopenssl
para fornecer uma fonte aleatória propagada , você pode gerar novamente as senhas conforme necessário. Observe que a segurança dessa abordagem depende apenas da força de sua senha, portanto, faça valer a pena.No exemplo a seguir, a semente aleatória depende de
user@site
,wallet#number
, qualquer que seja)Altere qualquer um deles e você obterá um resultado diferente.
Então, se minha senha foi
WienerSchnitzel
(não é uma boa escolha por razões óbvias), e se eu usei senhas no estilo XKCD em todos os lugares:E você pode executá-lo várias vezes, sempre dá o mesmo resultado:
Mas solicitar mais uma palavra é um resultado completamente diferente (como seria usar um dicionário diferente, etc.):
A desvantagem dessa abordagem é que, se alguém souber que você está usando esse método, eles podem tentar forçar sua frase secreta secreta e, em seguida, continuar a gerar todas as outras frases secretas.
Neste exemplo, não demora muito para adivinhar WienerSchnitzel. Para melhorar isso, você precisaria aplicar um hash caro (mas repetível) à própria senha.
E apenas use uma senha muito, muito melhor em primeiro lugar.
Você também pode codificar uma senha de alta entropia verdadeiramente aleatória, mas isso anula completamente o aspecto "facilmente memorável" das coisas.
Além disso, essa implementação depende de
shuf
selecionar sempre as palavras da mesma maneira, o que pode não ser o caso para versões futuras a longo prazo.Para completar:
Em poucas palavras:
Produz, por exemplo:
O código completo seria um pouco mais longo, tipo,
No lado positivo, você ocasionalmente obtém perls como este:
No lado negativo, você pode obter palavras difíceis de soletrar ou até mesmo digitar:
E, claro, se você escolher uma saída entre as várias opções, você reduz drasticamente o espaço de pesquisa, então você tem que se ater ao primeiro conjunto (ou seja, verdadeiramente aleatório) de palavras.
xkcdpass é uma maneira simples de obter isso sem escrever frases curtas.
Existem opções para definir o número de palavras, etc.
Para instalar:
pip install xkcdpass
(pode ser necessáriosudo
).python
andpython-pip
, para Python 2 ou 3.