Generador de frases de contraseña sin conexión para Linux

Hay muchos generadores de contraseñas, pero como en muchos casos son preferibles las frases de contraseña generadas aleatoriamente de manera uniforme , estoy buscando específicamente un generador de frases de contraseña aleatorias y seguras . Me gustaría poder usarlo fuera de línea (por razones de seguridad) bajo Linux.

Debería:

  • generar las frases de contraseña fuera de línea
  • trabajar en Linux (aunque en última instancia se prefieren las soluciones multiplataforma)
  • ser de código abierto

Y opcionalmente, sería bueno si pudiera:

  • ser capaz de usar diccionarios de diferentes idiomas (es decir, no necesariamente limitarse al inglés)
  • (en un mundo perfecto) ser capaz de mezclar diccionarios y generar frases de contraseña que sean una mezcla de idiomas (por ejemplo, inglés y alemán)
  • mostrar la entropía de la contraseña generada
¿Para qué sistema operativo quieres esto?
¿Está gravitando hacia las frases de contraseña para poder recordarlas en varios sitios? Si es así, ¿no tiene más sentido hacer una lluvia de ideas tú mismo? Si planea usar un administrador de contraseñas para las frases de contraseña, tendría más sentido usar contraseñas largas generadas aleatoriamente. Una frase de contraseña de 50 caracteres es menos segura que una contraseña de 50 caracteres generada aleatoriamente. Ese XKCD está comparando frases de paso largas con contraseñas cortas.
@ZeroFlux "¿no tiene más sentido hacer una lluvia de ideas tú mismo?" No del todo : "la selección de palabras debe ser (uniformemente) aleatoria. Si le pide a los humanos que elijan palabras al azar, obtiene un gran sesgo para los sustantivos concretos. Tales sesgos pueden y serán explotados". Mi interés es crear contraseñas maestras, algo utilizable en última instancia pero seguro, que usaría, por ejemplo, para proteger el administrador de contraseñas en sí...
Ah, lo siento, veo la confusión. No me refiero a tratar de generar mentalmente una frase de contraseña segura, sino a usar cualquier herramienta que te apetezca para seleccionar las palabras en sí. Hay tantos recursos para hacerlo que parecía un lugar lógico para comenzar. Pero ha confirmado su interés en las frases de paso, así que intentaré dar una respuesta. creativegames.net/random-word-generator linuxconfig.org/random-word-generator stackoverflow.org/wiki/… stackoverflow.com/questions/18834636/…
@ZeroFlux En última instancia, cualquier herramienta que se pueda usar para generar una selección de palabras aleatorias de un diccionario local funcionaría igual de bien para este propósito, siempre que el RNG sea de buena calidad. Pero, lamentablemente, esto impide el uso de sitios web como el que propones o generadores de frases de contraseña en línea como este .
¡ Juego de dados ! (+ en Wikipedia ). Quizás no sea precisamente lo que OP está buscando, pero...

Respuestas (2)

Ipsum

También quería un generador de palabras aleatorias para crear contraseñas y no pude encontrar nada, así que creé Ipsum . Es un script bash (destinado a ser utilizado desde la terminal). Ipsum cumple estos criterios:

  • Fuera de línea : usa diccionario, por lo que no se necesita Internet
  • Linux : es un script bash, por lo que es compatible con Linux
    • Nota: es posible que deba modificar la ubicación del diccionario
  • Open Source : el código es de dominio público
  • Idiomas : puede generar palabras aleatorias de idiomas distintos del inglés
  • Aleatorio : este uso /dev/urandomaparentemente es un 'PRNG criptográfico '
  • Entropía : tiene opción para mostrar la entropía de las palabras generadas

Uso

Aquí hay algunos ejemplos para ilustrar cómo funciona Ipsum. También es importante saber que al traducir, Ipsum muestra la palabra en inglés debajo de la palabra traducida y no todas las palabras aleatorias se traducirán. Una vez que Ipsum genera una lista de palabras (en el idioma que desee), simplemente elija un subconjunto para usar como contraseña.

Defecto

$ ipsum
unbalanced

Especificar número

$ ipsum 12
tramp
cutoff
scoured
sundowns
indigence
pellagra
offs
heaping
peevishly
judiciary
unmerciful
haul

Idioma alternativo [alemán]

$ ipsum --lang de 5
enormousness
   ^ enormousness
Tonsuren
   ^ tonsures
Harfenist
   ^ harpist
Oligarchie
   ^ oligarchy
nachlassen
   ^ letup

Idioma alternativo [japonés]

$ ipsum -l ja 5
再要求
   ^ reclaims
喫水線
   ^ waterline
同意しません
   ^ disagree
皮質
   ^ cortex
リクルーター
   ^ recruiter

Bits de entropía

$ ipsum --entropy 4
4 word(s) from 1 language(s) produces 65.36 bits of entropy.

happening
commander
parred
woodland

Código fuente

Esto es un poco largo, pero pensé en proporcionarlo para su placer de navegación. Aquí está la esencia para ello.

#!/bin/bash
function ipsum
{
    # Random Word Generator 
    # Inspired by:
    #      - https://linuxconfig.org/random-word-generator
    #      - http://stackoverflow.com/a/14203146/4769802
    #      - http://www.unix.com/shell-programming-and-scripting/156551-check-whether-string-begin-uppercase-lowercase-digit.html 
    #
    # Depends on:
    #      - translate-shell: https://github.com/soimort/translate-shell
    #        - This ^ thing is awesome. Seriously, try it out!


#-----------------------------------------------------------------Constants 
    X=0
    COUNT=1
    MAX_INT=16777216
    LANGUAGE=false
    LANGUAGES="en"
    NUM_LANGUAGES=1
    ENTROPY=false
    ALL_NON_RANDOM_WORDS=/usr/share/dict/words # dictionary file
    non_random_words=`cat $ALL_NON_RANDOM_WORDS | wc -l` # total # of words 
    proper_nouns=`cat $ALL_NON_RANDOM_WORDS | grep [A-Z].* | wc -l` # apprx # of proper nouns
    total_options=$((non_random_words - proper_nouns)) # apprx # of options

#-----------------------------------------------------------------Handle Flags w. Params
    while [[ $# -gt 1 ]]
    do
        key="$1"
        case $key in
            -e|--entropy)
                    # print the entropy
                    ENTROPY=true
                    ;;
            -l|--lang)
                    # Get the specifed languages!
                    LANGUAGE=true
                    LANGUAGES=(${2//+/ })
                    NUM_LANGUAGES=${#LANGUAGES[@]}
                    shift # past argument
                    ;;
            --lang-all)
                    # Use top 10 languages at once!
                    LANGUAGE=true
                    LANGUAGES=(zh pt es bn en ru hi ja ar pa)
                    NUM_LANGUAGES=${#LANGUAGES[@]}
                    ;;
            *)
                    echo "Unrecognized argument: try 'ipsum --help'"
                    exit
                    ;;
    esac
    shift # past argument or value
    done

#-----------------------------------------------------------------Handle Main Param
    if [[ -n $1 ]]; then
        case $1 in
            -a|--about)
                    # Give a description of self
                    echo "Ipsum is a minimalist random word generator"
                    echo "with several notable features:"
                    echo "       - Off-line: uses local dictionary so"
                    echo "                   no internet is needed"
                    echo "       - Languages: can generate non-English words"
                    echo "          - Note: this requires the internet"
                    echo "       - Random: uses '/dev/urandom' which is a CSPRNG"
                    echo "       - Entropy: calculates entropy of requested word combo"
                    echo ""
                    exit
                    ;;
            -h|--help)
                    # Show some examples
                    echo ""
                    echo "Example Usage: ipsum"
                    echo "               ipsum 12"
                    echo "               ipsum -lang fr 12"
                    echo "               ipsum -l fr 12"
                    echo "               ipsum -l fr+ru 12"
                    echo "               ipsum --entropy 12"
                    echo "               ipsum -e 12"
                    echo "               ipsum -l fr+ru -e 12"
                    echo ""
                    echo "Language Options:"
                    echo "               - Found here :: https://github.com/soimort/translate-shell"
                    echo ""
                    exit
                    ;;
            -i|--info)
                    # Show information about numbers and such
                    echo ""
                    echo "Dictionary Location: $ALL_NON_RANDOM_WORDS"
                    echo "Dictionary Size:     $non_random_words"
                    echo "Proper Nouns:        $proper_nouns"
                    echo "Usable Words:        $total_options"
                    echo "Default Language:    $LANGUAGES"
                    echo "Possible Languages:  124"
                    echo "      _________________________________ "
                    echo "     |  Top Ten Most Common Languages  |"
                    echo "     |----------------|----------------|"
                    echo "     | Chinese - zh   | Portuguese - pt|"
                    echo "     | Spanish - es   | Bengali  - bn  |"
                    echo "     | English - en   | Russian  - ru  |"
                    echo "     | Hindi   - hi   | Japanese - ja  |"
                    echo "     | Arabic  - ar   | Punjabi  - pa  |"
                    echo "     |________________|________________|"
                    echo ""
                    exit
                    ;;
            [0-9]*)
                    # It is probably a number, so work normally
                    COUNT="$1"
                    ;;
            *)
                    echo "Unrecognized argument: try 'ipsum --help'"
                    exit
                    ;;
        esac

    fi

#-----------------------------------------------------------------Calculate Entrophy
    if [ "$ENTROPY" = true ]; then
        # Equation = log_2( #_of_options * #_of_languages ) * #_of_words
        log_base_2=`echo "l($total_options*$NUM_LANGUAGES)/l(2)" | bc -l` # log base 2 of options
        entropy_bits=`printf "%.*f\n" 2 $log_base_2` # bits of entropy per word
        total_entropy=$(echo "$entropy_bits * $COUNT" | bc)
        echo "$COUNT word(s) from $NUM_LANGUAGES language(s) produces $total_entropy bits of entropy."
        echo ""
    fi

#-----------------------------------------------------------------Make $COUNT Random Words
    while [[ "$X" -lt "$COUNT" ]]; do
        random_number=`echo "$(od -N3 -An -i /dev/urandom)*$non_random_words/$MAX_INT" | bc`
        WORD=$(sed `echo $random_number`"q;d" $ALL_NON_RANDOM_WORDS)
        # Clean and Format
        DEL="'s"
        WORD=${WORD%$DEL}
        DEL="'"
        WORD=${WORD%$DEL}
        # Clean out 'funny' words (ie proper nouns)
        case ${WORD:0:1} in
            [[:lower:]])
                    # Lowercase indicates a common noun
                    if [ "$LANGUAGE" = true ]; then # If lang was specified use trans
                        random_index=`echo "$(od -N3 -An -i /dev/urandom)*$NUM_LANGUAGES/$MAX_INT" | bc`
                        LANG=${LANGUAGES[random_index]}
                        trans -b :$LANG $WORD 2> /dev/null
                        echo "   ^ $LANG for $WORD"
                    else # else just given normal word
                        echo "$WORD"
                    fi
                    let "X = X + 1" 
                    ;;
            *)
                    # Don't use whatever $WORD was
                    ;;
        esac
    done
}

ipsum "$@"

Orígenes

El nombre, Ipsum, proviene de Lorem Ipsum , el nombre del texto de relleno para los elementos gráficos de una presentación visual.

ipsum.sh, a pesar de que su .shextensión actualmente es solo una función de shell, carece de una primera línea #!/bin/bashy una última línea ipsum "$@".
Eso fue intencional, tiene la .shextensión para resaltado de sintaxis. Importo mis funciones desde my .bashrcpara que sean fáciles de administrar.
La respuesta anterior debe mencionar que ipsum()es una función que debe cargarse primero, es decir . ipsum.sh ; impsum -h. Además, corríjame si me equivoco, pero no .bashrcasigna su propia memoria ambiental para cada instancia de bash? Si ese es el caso, ejecutar varios shells (en diferentes pestañas de un emulador de terminal GUI) cargaría varias instancias redundantes de ipsum().
@agc lo editaré. Tiene razón en que es un poco derrochador, pero me gusta la facilidad de configuración y también me gusta la capacidad de organizar fácilmente.

Existen algunos recursos para ayudarlo a generar frases de contraseña aleatorias, aunque es posible que deba realizar algunos pasos adicionales para combinar diccionarios o visualizar la entropía.

Este script bash simple extraerá su directorio /usr/share/dict/words como la población de palabras elegibles. Puede especificar cuántas palabras aleatorias y usar su propio archivo de palabras. http://linuxconfig.org/generador-de-palabras-aleatorias

Eche un vistazo a este script también, que proporciona algunas opciones configurables más fácilmente, como la longitud mínima y máxima de las palabras: http://stackoverflow.org/wiki/Dictionary-based_random_password_generator

Diablos, para obtener más inspiración, consulte esta breve discusión sobre SO sobre cómo escribir un script de este tipo en Python: https://stackoverflow.com/questions/18834636/random-word-generator-python

¡Espero que ayude!

Editar: tenga en cuenta que no estoy versado en los procesos pseudoaleatorios que se pueden usar detrás de escena en Python o Linux, por lo que no puedo comentar sobre posibles vulnerabilidades en ese sentido.