One-liner para gerar uma senha facilmente memorável? [duplicado]

42

O que é um bom one-liner para gerar uma senha facilmente memorável, como o staple correto da bateria do cavalo do xkcd ou uma semente de Bitcoin?

EDIT 1 :

Não é o mesmo que gerar uma string aleatória Seqüências aleatórias não são de todo memoráveis. Compare com o xkcd obrigatório ...

    
por moblie 20.09.2018 / 16:21

10 respostas

40

Primeiro, instale um dicionário de um idioma com o qual você está familiarizado:

sudo apt-get install <language-package>

Para ver todos os pacotes disponíveis:

apt-cache search wordlist | grep ^w

Nota: todas as instruções de instalação assumem que você está em um sistema operacional baseado no Debian.

Depois de instalar o dicionário, execute:

WORDS=5; LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${WORDS} | paste -sd "-"

Qual será a saída ex:

blasphemous-commandos-vasts-suitability-arbor

Para dividir:

  • WORDS=5; - escolha quantas palavras você deseja em 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 ' ou caracteres originais como éclair ). LC_ALL=C garante que [a-z] na expressão regular não corresponda a símbolos semelhantes a letras que não sejam letras minúsculas sem diacríticos.
  • shuf --random-source=/dev/urandom -n ${WORDS} - escolheu quantas PALAVRAS foram solicitadas. --random-source=/dev/urandom garante que shuf semeia seu gerador aleatório com segurança; sem ele, shuf é padronizado para 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 "-" - una todas as palavras usando - (sinta-se livre para mudar o símbolo para outra coisa).

Como alternativa, você pode envolvê-lo em uma função:

#!/bin/bash

function memorable_password() {
  words="${1:-5}"
  sep="${2:--}"

  LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep"
}

ou

#!/bin/sh

memorable_password() {
  words="$1"
  if [ -z "${words}" ]; then
    words=5
  fi

  sep="$2"
  if [ -z "${sep}" ]; then
    sep="-"
  fi

  LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep"
}

Ambos podem ser chamados como tal:

memorable_password 7 _
memorable_password 4
memorable_password

Retornando:

skipped_cavity_entertainments_gangway_seaports_spread_communique
evaporated-clashes-bold-presuming
excelling-thoughtless-pardonable-promulgated-forbearing

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):

WORDS=5; man git | \
  tr ' ' '\n' | \
  egrep '^[a-z]{4,}$' | \
  sort | uniq | \
  shuf --random-source=/dev/urandom -n ${WORDS} | \
  paste -sd "-"
    
por 20.09.2018 / 20:50
37

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 estão distribuindo corretamente, e alguém que conheça seu método poderá reproduzir suas senhas. Da mesma forma, comporte-se com utilitários de várias finalidades se você não tiver certeza de como usá-los corretamente.

pwqgen de passwdqc .

    
por 21.09.2018 / 04:40
14

Você precisa de um dicionário de lista de palavras, já que mencionou o bitcoin, muito provavelmente você quer este:

link

Se sua língua nativa não é 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 :

$ shuf -n 4 english.txt 
anchor
neck
trumpet
response

Note que você precisará de mais do que apenas 4 palavras para uma senha realmente segura. 4 palavras é para um serviço online em que o número de tentativas que um atacante pode fazer é muito limitado. Acho que a recomendação do 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 opção --repeat :

$ shuf -n 4 -r english.txt

Isso permitiria que cada palavra aparecesse mais de uma vez.

Se você quiser a saída em uma linha, basta adicionar xargs echo :

$ shuf -n 4 english.txt | xargs echo
math easily cube daughter

Ou se você preferir a substituição de comandos:

$ echo $(shuf -n 4 -r english.txt)
photo milk roast ozone

Em um sidenote, não acho esse estilo de senha fácil de memorizar.

Bem, na verdade eu tive muita sorte com math easily cube daughter , já que isso faz com que seja fácil pensar em uma história em que sua filha pode facilmente fazer cálculos com cubos ou algo assim. É algo que os humanos podem se relacionar, como é o cavalo no exemplo do XKCD.

Mas o que diabos é um anchor neck trumpet response ? Eu não sou um autor de quadrinhos com criatividade de sobra para inventar um mnemônico para isso. Então será esquecido em nenhum momento.

Mesmo que você consiga lembrar as palavras, é difícil lembrar a ordem correta delas. Foi math easily cube daughter ou daugher easily math cube ou outra coisa?

E a senha deve ser aleatória, você não tem permissão para escolher 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 que cometa erros.

Se você tiver dúvidas sobre a aleatoriedade de shuf , adicione o parâmetro --random-source=/dev/urandom a todos os comandos shuf .

Veja também o link

    
por 20.09.2018 / 16:35
10

Eu tenho isso:

xkcd_password () { 
    command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4
}
    
por 20.09.2018 / 16:28
8

Tente isso,

shuf --random-source=/dev/urandom -n5 /usr/share/dict/words | sed 's/[^[:alnum:]]//g' | paste -sd_

Saída :

Quayles_knockwursts_scrotums_Barrie_hauler

Explicação :

  • shuf --random-source=/dev/urandom -n5 /usr/share/dict/words Obter 5 palavras aleatórias do arquivo dict
  • sed 's/[^[:alnum:]]//g' Remover caracteres não alfanuméricos
  • paste -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 a tiver. Pode estar no seu repositório de distros, por exemplo link :

sudo apt install wamerican
    
por 20.09.2018 / 16:29
4

Como sugerido por @R .. mas para máquinas RHEL / CentOS (disponíveis no repositório EPEL):

pwgen

Observe este trecho da manpage de pwgen (ênfase minha):

The pwgen program generates passwords which are designed to be easily memorized by humans, while being as secure as possible. Human-memorable passwords are never going to be as secure as completely completely random passwords.

    
por 21.09.2018 / 09:12
1

Se você quiser que seja ainda mais fácil de memorizar, você também pode usar a abordagem hash de senhas (lembre-se de uma única frase secreta para gerar muitas outras senhas). Em vez de memorizar centenas de senhas, basta memorizar o método para gerá-las.

Usando shuf com openssl para fornecer um aleatório semeado fonte , você pode gerar novas senhas conforme necessário. Por favor, note que a segurança desta abordagem depende apenas da força da sua senha, então faça valer a pena.

No exemplo a seguir, a semente aleatória depende de

  • sua frase secreta (obviamente)
  • uma finalidade designada ( user@site , wallet#number , o que for)
  • a lista de palavras usada (hash)
  • número de palavras solicitadas

Altere qualquer um desses e obtenha um resultado diferente.

get_seeded_random() {
    seed=$(printf "%s:" "$@")
    openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    < /dev/zero 2>/dev/null
}

get_random_words() {
    dictionary=$1
    number=$2
    passphrase=$3
    purpose=$4

    dictionary_hash=$(sha1sum < "$dictionary")

    shuf -n "$number" \
         --random-source=<(get_seeded_random
            "$passphrase" "$purpose" "$dictionary_hash" "$number") \
         "$dictionary" \
    | xargs echo
}

Então, se a minha senha era WienerSchnitzel (não é uma boa escolha por razões óbvias), e se eu usasse senhas do estilo XKCD em todos os lugares:

$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone
$ get_random_words english.txt 4 WienerSchnitzel wallet:2
vapor comfort various bitter
$ get_random_words english.txt 4 WienerSchnitzel [email protected]
any actor tobacco tattoo

E você pode executá-lo várias vezes, sempre dá o mesmo resultado:

$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone
$ get_random_words english.txt 4 WienerSchnitzel wallet:1
robust lottery ugly stone

Mas solicitar mais uma palavra é um resultado completamente diferente (como seria usar um dicionário diferente, etc.):

$ get_random_words english.txt 5 WienerSchnitzel wallet:1
crash category extra hollow cloud

A desvantagem dessa abordagem é que, se alguém souber que você está usando esse método, ela poderá tentar forçar sua senha secreta e depois gerar todas as outras senhas.

Neste exemplo, não demorou muito para adivinhar WienerSchnitzel. Para melhorar isso, você precisa aplicar um hash caro (mas repetitivo) à senha em si.

# poor man's expensive hash replacement
seed=$( (echo "$seed" ; head -c 1G /dev/zero) | sha1sum)

E apenas use uma senha 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 sempre selecionando palavras da mesma maneira, o que pode não ser o caso para futuras versões a longo prazo.

    
por 21.09.2018 / 14:29
0

Para completar:

git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git
cd xkcd-passphrase-generator
./generate.sh
    
por 22.09.2018 / 10:09
0

Em poucas palavras:

random.sample(open("/usr/share/dict/words").readlines(), 4)

Produz, por exemplo:

['controverts\n', "Queensland's\n", 'plaids\n', 'aback\n']

O código completo seria um pouco mais longo, como

import random; print("".join(random.sample(open("/usr/share/dict/words").readlines(), 4)))
Weyden
Geronimo's
Jidda
enumerate

No lado positivo, você ocasionalmente obtém perls assim:

polyamory
replicates
unmarried
diseases

No lado negativo, você pode encontrar palavras difíceis de escrever ou digitar:

fezzes
Lumière's
tercentenary's
Liliuokalani

E, claro, se você selecionasse uma saída dentre as várias opções, diminuiria drasticamente o espaço de pesquisa, de modo que você teria que manter o primeiro conjunto de palavras (ou seja, verdadeiramente aleatório).

    
por 24.09.2018 / 03:54
0

xkcdpass é uma maneira simples de conseguir isso sem escrever frases simples.

$ xkcdpass 
optimal mycology Kumamoto thorny chrism unsavoury

Existem opções para definir o número de palavras, etc.

Para instalar:

  • Linux / Unix / macOS: pip install xkcdpass (talvez você precise sudo ).
  • Se você não tiver o Python / pip, procure por pacotes como python e python-pip , para o Python 2 ou 3.
por 27.09.2018 / 08:31