AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 470288
Accepted
moblie
moblie
Asked: 2018-09-21 06:21:40 +0800 CST2018-09-21 06:21:40 +0800 CST 2018-09-21 06:21:40 +0800 CST

One-liner para gerar uma senha fácil de memorizar? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Gere quatro palavras aleatórias de uma lista para senhas do tipo XKCD (3 respostas)
Fechado há 4 anos .

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 ...

shell-script scripting
  • 10 10 respostas
  • 8583 Views

10 respostas

  • Voted
  1. Best Answer
    meeDamian
    2018-09-21T10:50:00+08:002018-09-21T10:50:00+08:00

    Antes de tudo, instale um dicionário de um idioma com o qual você esteja familiarizado, usando:

    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 em 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 "-"
    

    Que irá produzir ex:

    blasphemous-commandos-vasts-suitability-arbor
    

    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=Cgarante 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/urandomgarante que shufsemeia seu gerador aleatório de forma segura; sem ele, o shufpadrã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:

    #!/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 assim:

    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 "-"
    
    • 43
  2. R.. GitHub STOP HELPING ICE
    2018-09-21T18:40:34+08:002018-09-21T18:40:34+08:00

    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.

    pwqgende passwdqc.

    • 37
  3. frostschutz
    2018-09-21T06:35:00+08:002018-09-21T06:35:00+08:00

    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:

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

    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 --repeatopção:

    $ 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 preferir substituição de comando:

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

    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 daughterjá 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 daughterou daugher easily math cubeou 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/urandomparâmetro a todos os shufcomandos.

    Veja também https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources

    • 13
  4. glenn jackman
    2018-09-21T06:28:24+08:002018-09-21T06:28:24+08:00

    Eu tenho isto:

    xkcd_password () { 
        command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4
    }
    
    • 9
  5. pLumo
    2018-09-21T06:29:02+08:002018-09-21T06:29:02+08:00

    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/wordsObtenha 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 tiver. Pode estar em seu repositório de distros, por exemplo https://packages.debian.org/sid/wordlist :

    sudo apt install wamerican
    
    • 8
  6. dr_
    2018-09-21T23:12:27+08:002018-09-21T23:12:27+08:00

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

    pwgen
    

    Observe este trecho da página de manual do pwgen (ênfase minha):

    O programa pwgen gera senhas que são projetadas para serem facilmente memorizadas por humanos, sendo o mais seguras possível. Senhas que podem ser memorizadas por humanos nunca serão tão seguras quanto senhas completamente aleatórias.

    • 4
  7. frostschutz
    2018-09-22T04:29:26+08:002018-09-22T04:29:26+08:00

    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 shufwith opensslpara 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

    • sua senha (obviamente)
    • um propósito designado ( user@site, wallet#number, qualquer que seja)
    • a lista de palavras usada (hash dela)
    • número de palavras solicitadas

    Altere qualquer um deles e você obterá 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 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:

    $ 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, 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.

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

    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.

    • 1
  8. l0b0
    2018-09-23T00:09:23+08:002018-09-23T00:09:23+08:00

    Para completar:

    git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git
    cd xkcd-passphrase-generator
    ./generate.sh
    
    • 0
  9. user141424
    2018-09-24T17:54:01+08:002018-09-24T17:54:01+08:00

    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, tipo,

    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 como este:

    polyamory
    replicates
    unmarried
    diseases
    

    No lado negativo, você pode obter palavras difíceis de soletrar ou até mesmo digitar:

    fezzes
    Lumière's
    tercentenary's
    Liliuokalani
    

    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.

    • 0
  10. RichVel
    2018-09-27T22:31:30+08:002018-09-27T22:31:30+08:00

    xkcdpass é uma maneira simples de obter isso sem escrever frases curtas.

    $ 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(pode ser necessário sudo).
    • Se você não tiver Python/pip, procure por pacotes como pythonand python-pip, para Python 2 ou 3.
    • 0

relate perguntas

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

  • Renomeie (acrescentar) arquivos CSV em massa com base em um valor dentro

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • MySQL Select com função IN () com array bash

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve