Автономный генератор паролей для Linux

Существует множество генераторов паролей, но поскольку во многих случаях предпочтительнее использовать случайно сгенерированные парольные фразы , я специально ищу генератор случайных и безопасных парольных фраз . Я хотел бы иметь возможность использовать его в автономном режиме (из соображений безопасности) под Linux.

Должно:

  • генерировать парольные фразы в автономном режиме
  • работать в Linux (хотя в конечном итоге предпочтение отдается кроссплатформенным решениям)
  • быть открытым исходным кодом

И, опционально, было бы неплохо, если бы он мог:

  • уметь пользоваться словарями с разных языков (т.е. не обязательно ограничиваться английским языком)
  • (в идеальном мире) иметь возможность смешивать словари и генерировать парольные фразы, которые представляют собой смесь языков (например, английского и немецкого)
  • отображать энтропию сгенерированного пароля
Для какой ОС вы хотите это?
Вы тяготеете к фразам-паролям, чтобы запомнить их для нескольких сайтов? Если да, то не лучше ли провести мозговой штурм самостоятельно? Если вы планируете использовать менеджер паролей для фраз-паролей, было бы разумнее просто использовать длинные случайно сгенерированные пароли. Парольная фраза из 50 символов менее надежна, чем случайно сгенерированный 50-символьный пароль. Этот XKCD сравнивает длинные пароли с короткими паролями.
@ZeroFlux "Разве не лучше провести мозговой штурм самостоятельно?" Не совсем : «выбор слов должен быть (равномерно) случайным. Если вы попросите людей выбирать слова наугад, вы получите сильную предвзятость к конкретным существительным. Такие предубеждения могут и будут использоваться». Мой интерес состоит в том, чтобы придумать мастер-пароли, что-то в конечном счете полезное, но безопасное, что я бы использовал, например, для защиты самого менеджера паролей...
Ах, извините, я вижу путаницу. Я не имел в виду попытку сгенерировать безопасную парольную фразу в уме, а скорее использовал любые инструменты, которые вам понравятся, чтобы выбрать сами слова. Для этого существует так много ресурсов, что это казалось логичным местом для начала. Но вы подтвердили свой интерес к фразам-паролям, так что я постараюсь скинуться на ответ. creativegames.net/генератор случайных слов linuxconfig.org/генератор случайных слов stackoverflow.org/wiki/… stackoverflow.com/questions/18834636/…
@ZeroFlux В конечном счете, любой инструмент, который можно использовать для вывода случайных слов из локального словаря, будет так же хорошо работать для этой цели, если ГСЧ хорошего качества. Но, к сожалению, это исключает использование веб-сайтов, подобных тому, который вы предлагаете, или онлайн-генераторов фраз-паролей, подобных этому .
Посуда ! (+ в Википедии ). Возможно, это не совсем то , что ищет ОП, но.....

Ответы (2)

Ипсум

Я также хотел генератор случайных слов для создания паролей и ничего не мог найти, поэтому я создал Ipsum . Это bash-скрипт (предназначен для использования с терминала). Ipsum удовлетворяет следующим критериям:

  • Off-line : использует словарь, поэтому интернет не нужен.
  • Linux : это bash-скрипт, поэтому он совместим с Linux.
    • Примечание: может потребоваться изменить расположение словаря.
  • Открытый исходный код : код является общественным достоянием
  • Языки : может генерировать случайные слова из неанглийских языков.
  • Random : это использование /dev/urandom, которое, по-видимому, является «криптографическим PRNG».
  • Энтропия : есть возможность отображать энтропию сгенерированных слов.

Применение

Вот несколько примеров, иллюстрирующих, как работает Ipsum. Также важно знать, что при переводе Ipsum отображает английское слово под переведенным словом, и не все случайные слова будут переведены. Как только Ipsum сгенерирует список слов (на любом языке, который вы хотите), просто выберите подмножество для использования в качестве пароля.

По умолчанию

$ ipsum
unbalanced

Укажите номер

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

Альтернативный язык [немецкий]

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

Альтернативный язык [японский]

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

Биты энтропии

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

happening
commander
parred
woodland

Исходный код

Это довольно длинно, но я подумал, что предоставлю его для вашего удовольствия от просмотра. Вот в чем суть.

#!/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 "$@"

Истоки

Название Ipsum происходит от Lorem Ipsum — названия текста-заполнителя для графических элементов визуальной презентации.

ipsum.sh, несмотря на то, что его .shрасширение в настоящее время является просто функцией оболочки, в нем отсутствуют первая #!/bin/bashи последняя строки ipsum "$@".
Это было сделано намеренно, у него есть .shрасширение для подсветки синтаксиса. Я импортирую свои функции из моего, .bashrcчтобы ими было легко управлять.
В приведенном выше ответе следует упомянуть, что ipsum()это функция, которую необходимо загрузить в первую очередь, . ipsum.sh ; impsum -hт.е. Кроме того, пожалуйста, поправьте меня, если я ошибаюсь, но не .bashrcвыделяет собственную память окружения для каждого экземпляра bash? Если это так, то запуск нескольких оболочек (на разных вкладках эмулятора терминала с графическим интерфейсом) загрузит несколько избыточных экземпляров ipsum().
@agc я отредактирую. Вы правы, это немного расточительно, но мне нравится простота настройки, а также возможность легко организовать.

Есть несколько ресурсов, которые помогут вам генерировать случайные фразы-пароли, хотя вам, возможно, придется предпринять несколько дополнительных шагов, чтобы объединить словари или визуализировать энтропию.

Этот простой bash-скрипт извлечет ваш каталог /usr/share/dict/words как совокупность подходящих слов. Вы можете указать, сколько случайных слов и использовать свой собственный файл слов. http://linuxconfig.org/генератор случайных слов

Взгляните также на этот скрипт, который предоставляет несколько более легко настраиваемых параметров, таких как минимальная и максимальная длина слова: http://stackoverflow.org/wiki/Dictionary-based_random_password_generator

Черт возьми, для дальнейшего вдохновения ознакомьтесь с этим кратким обсуждением SO о написании такого скрипта на Python: https://stackoverflow.com/questions/18834636/random-word-generator-python

Надеюсь, это поможет!

Редактировать: обратите внимание, что я не разбираюсь в том, какие псевдослучайные процессы могут использоваться за кулисами в Python или Linux, поэтому я не могу комментировать любые возможные уязвимости на этом конце.