Как проверить силу пароля [dублировать]

У этого вопроса уже есть ответ здесь: Как применить политику сложности паролей? 1 ответ

Я написал этот скрипт, но [:alnum:] не работает. Кто-нибудь помогает?

echo -n "Enter a password : " read password LEN=$(echo ${#password}) if [ $LEN -lt 10 ]; then echo "$password is smaller than 10 characters" else if ! [ -z `echo $password | tr -d "[:alnum:]"` ]; then echo "$password is a weak password" else echo "$password is a strong password" fi fi echo
4
задан 10 November 2017 в 15:20

10 ответов

Наконец, следующий скрипт, который я написал, решил мою проблему:

echo -n "Enter a password : " read password LEN=$(echo ${#password}) if [ $LEN -lt 10 ]; then echo "$password is smaller than 10 characters" else if [ -z `echo $password | tr -d '[:alpha:]' | tr -d '[:upper:]' | tr -d '[:lower:]' ` ] || [ -z `echo $password | tr -d '[:upper:]' | tr -d '[:digit:]' `] || [ -z `echo $password | tr -d '[:lower:]' | tr -d '[:digit:]' `] ; then echo "$password is a weak password" else echo "$password is a strong password" fi fi echo

Спасибо за ваши ребята!

-3
ответ дан 18 July 2018 в 03:32

Запах ужасно, как проблема XY для меня. Никогда не пишите свои собственные инструменты для работы с паролями. По крайней мере, вы здесь не занимаетесь хранением паролей, но первое, что приходит в голову с вашим кодом, это то, что я могу ввести пароль с полным номером и считать его «сильным» (когда на самом деле он будет намного слабее чем полный алфавитный пароль). Если вы продолжите этот подход к защите / обработке паролей, вы рано или поздно свалитесь, и это будет не так, когда это произойдет.

Правильное решение - использовать внешнюю библиотеку или вспомогательное приложение для определения силы пароля (и выполнения других задач, связанных с паролем). Большинство систем Linux в наши дни имеют PAM, которые могут безопасно выполнять все связанные с проверкой подлинности задачи (в качестве бонуса вы получаете поддержку других методов проверки подлинности, помимо паролей, в зависимости от того, как настроена система пользователя), и muru уже предложил вспомогательное приложение, определяющее силу пароля.

7
ответ дан 18 July 2018 в 03:32

Я нашел правильный скрипт, и он работает:

echo -n "Enter a password : " read password LEN=$(echo ${#password}) if [ $LEN -lt 10 ]; then echo "$password is smaller than 10 characters" else if [ -z `echo $password | tr -d '[:alpha:]' | tr -d '[:upper:]' | tr -d '[:lower:]' ` ]; then echo "$password is a weak password" else echo "$password is a strong password" fi fi echo
-3
ответ дан 18 July 2018 в 03:32

Если вы хотите создать хороший метод для создания паролей

См.

Генератор паролей, объединяющий фактические слова

Генератор паролей, объединяющий фактические слова

Ваш вопрос: как проверить силу пароля?

Как применить политику сложности пароля?

Вы можете проверить только определенные аспекты пароля или используйте специальный инструмент для каждого метода для создания пароля или общего метода грубой силы (если злоумышленник не знает метод).

Оболочка pwdcheck с использованием cracklib-check

#!/bin/bash # setting variables usage="Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase" minlen=20 # can be modified here short="is shorter than $minlen characters" goodmix="is long enough" badmix="is too short $usage" separator="-------" # checking parameter if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ $# -gt 1 ]; then echo "${0##*/} uses 'cracklib-check'" echo "----------------------------------------------------------------" echo "Usage: $0 CandidateContaining4DifferentWords" echo "Example: $0 At-least-$minlen-char" echo " $0 'Should.be.selected.via.*random*.process'" echo " $0 'Single-quote-for-1-special-character!'" echo " $0 'FindPatternByDigitalTest123'" echo " $0 'Provoke1pattern2search3by4separating5words'" echo "$usage" exit elif [ $# -eq 0 ]; then echo "$usage" echo "----------------------------------------------------------------" read -p "Enter a password : " password elif [ $# -eq 1 ]; then password="$1" fi # checking and installing if necessary which cracklib-check > /dev/null if [ $? -eq 1 ]; then read -p "Do you want to install 'cracklib-runtime' to get 'cracklib-check'? (y/N) " ans if [ "$ans" == "y" ]; then sudo apt-get update && sudo apt-get install cracklib-runtime fi fi if [ ${#password} -lt $minlen ]; then result="$short" else result="$goodmix" case "$password" in *[![:alnum:]]*) alnm="'$password' contains characters other than ASCII letters and digits";; # result="$badmix";; *) alnm="$password contains only ASCII letters and digits";; esac fi echo "Test 1 - size&mix: '$password' $result" test ${#password} -lt $minlen || echo "$alnm" if [ "$result" == "$badmix" ] || [ "$result" == "$short" ]; then total="is bad" else total='is good' fi echo "$separator" echo "Test 2 - lexicon: '$password'" sed -e 's/[0-9]/123\n/g' -e 's/$//' -e 's/[§!@£$€#¤%/()=?*,;.:_-~ ]/123\n/g' -e 's/$/123/g' \ <<< "$password" | LANG=C cracklib-check |sed 's/123: /: /'| \ grep 'it is based on a dictionary word' if [ $? -ne 0 ]; then echo 'no comment' fi echo "$separator" echo "Test 3 - digital: '$password'" sed -e 's/[[:alpha:]]//g' -e 's/[§!@£$€#¤%/()=?*,;.:_-~ ]//g' -e 's/$/xyz/' \ <<< "$password" | LANG=C cracklib-check |sed 's/xyz: /: /'| \ grep 'it is too simplistic/systematic' if [ $? -eq 0 ]; then total='is bad' else echo 'is good' fi echo "$separator" echo "Test 4 - cracklib-check: '$password'" LANG=C cracklib-check <<< "$password" | tee /dev/stderr | grep ': OK' > /dev/null if [ $? -eq 0 ]; then echo='is good' else total='is bad' fi if [ "$total" == "is good" ]; then echo "$separator" ans= while [ "$ans" != "g" ] && [ "$ans" != "b" ] do read -p "Test 5 - manual: Is '$password' a good or bad password? (g/b) " ans if [ "$ans" == "g" ]; then echo 'is good' elif [ "$ans" == "b" ]; then total='is bad' echo "$total" fi done fi echo "$separator" if [ "$total" == "is good" ]; then echo "Every test result for '$password' $total: No weakness found :-)" else echo "Some test result for '$password' $total: Some weakness found :-(" fi

Текст справки

Запуск в текущем каталоге тестового каталога. где у вас есть файл shellscript,

$ ./pwdcheck -h pwdcheck uses 'cracklib-check' ---------------------------------------------------------------- Usage: ./pwdcheck CandidateContaining4DifferentWords Example: ./pwdcheck At-least-20-char ./pwdcheck 'Should.be.selected.via.*random*.process' ./pwdcheck 'Single-quote-for-1-special-character!' ./pwdcheck 'FindPatternByDigitalTest123' ./pwdcheck 'Provoke1pattern2search3by4separating5words' Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase

Пакет программ cracklib

$ apt-cache policy cracklib-runtime cracklib-runtime: Installerad: 2.9.2-1ubuntu1 Kandidat: 2.9.2-1ubuntu1 Versionstabell: *** 2.9.2-1ubuntu1 500 500 http://se.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages 100 /var/lib/dpkg/status 2.9.2-1build2 500 500 http://se.archive.ubuntu.com/ubuntu xenial/main i386 Packages

Тестирование различных примеров из текста справки

разумно

Ваш ручной осмотр и «тест» могут быть важными, чтобы избежать очень плохих паролей, но если вы использовали автоматический случайный метод с хорошей репутацией, вы должны полагаться на него и избегать подделывания результата, потому что вы, вероятно, сделаете пароль более легким для взлома.

$ ./pwdcheck CandidateContaining4DifferentWords Test 1 - size&mix: 'CandidateContaining4DifferentWords' is long enough CandidateContaining4DifferentWords contains only ASCII letters and digits ------- Test 2 - lexicon: 'CandidateContaining4DifferentWords' no comment ------- Test 3 - digital: 'CandidateContaining4DifferentWords' is good ------- Test 4 - cracklib-check: 'CandidateContaining4DifferentWords' CandidateContaining4DifferentWords: OK ------- Test 5 - manual: Is 'CandidateContaining4DifferentWords' a good or bad password? (g/b) b is bad ------- Some test result for 'CandidateContaining4DifferentWords' is bad: Some weakness found :-( # comment: This password is published here! ##### Short password ##### $ ./pwdcheck At-least-20-char Test 1 - size&mix: 'At-least-20-char' is shorter than 20 characters ------- Test 2 - lexicon: 'At-least-20-char' least: it is based on a dictionary word char: it is based on a dictionary word ------- Test 3 - digital: 'At-least-20-char' is good ------- Test 4 - cracklib-check: 'At-least-20-char' At-least-20-char: OK ------- Some test result for 'At-least-20-char' is bad: Some weakness found :-( ##### Reminder about random process ##### $ ./pwdcheck 'Should.be.selected.via.*random*.process' Test 1 - size&mix: 'Should.be.selected.via.*random*.process' is long enough 'Should.be.selected.via.*random*.process' contains characters other than ASCII letters and digits ------- Test 2 - lexicon: 'Should.be.selected.via.*random*.process' Should: it is based on a dictionary word selected: it is based on a dictionary word via: it is based on a dictionary word random: it is based on a dictionary word process: it is based on a dictionary word ------- Test 3 - digital: 'Should.be.selected.via.*random*.process' is good ------- Test 4 - cracklib-check: 'Should.be.selected.via.*random*.process' Should.be.selected.via.*random*.process: OK ------- Test 5 - manual: Is 'Should.be.selected.via.*random*.process' a good or bad password? (g/b) g is good ------- Every test result for 'Should.be.selected.via.*random*.process' is good: No weakness found :-) # comment: Do not use the password literally ;-) ##### Single quote the password, if you intend to use special characters ##### ##### Words are found by lexicon test (using cracklib-check), and accepted ##### $ ./pwdcheck 'Single-quote-for-1-special-character!' Test 1 - size&mix: 'Single-quote-for-1-special-character!' is long enough 'Single-quote-for-1-special-character!' contains characters other than ASCII letters and digits ------- Test 2 - lexicon: 'Single-quote-for-1-special-character!' Single: it is based on a dictionary word quote: it is based on a dictionary word for: it is based on a dictionary word special: it is based on a dictionary word character: it is based on a dictionary word ------- Test 3 - digital: 'Single-quote-for-1-special-character!' is good ------- Test 4 - cracklib-check: 'Single-quote-for-1-special-character!' Single-quote-for-1-special-character!: OK ------- Test 5 - manual: Is 'Single-quote-for-1-special-character!' a good or bad password? (g/b) b is bad ------- Some test result for 'Single-quote-for-1-special-character!' is bad: Some weakness found :-( ##### Showing how the digital test works (it uses cracklib-check) ##### $ ./pwdcheck 'FindPatternByDigitalTest123' Test 1 - size&mix: 'FindPatternByDigitalTest123' is long enough FindPatternByDigitalTest123 contains only ASCII letters and digits ------- Test 2 - lexicon: 'FindPatternByDigitalTest123' no comment ------- Test 3 - digital: 'FindPatternByDigitalTest123' 123: it is too simplistic/systematic ------- Test 4 - cracklib-check: 'FindPatternByDigitalTest123' FindPatternByDigitalTest123: OK ------- Some test result for 'FindPatternByDigitalTest123' is bad: Some weakness found :-( ##### Showing the lexicon test and the digital test ##### $ ./pwdcheck 'Provoke1pattern2search3by4separating5words' Test 1 - size&mix: 'Provoke1pattern2search3by4separating5words' is long enough Provoke1pattern2search3by4separating5words contains only ASCII letters and digits ------- Test 2 - lexicon: 'Provoke1pattern2search3by4separating5words' Provoke: it is based on a dictionary word pattern: it is based on a dictionary word search: it is based on a dictionary word separating: it is based on a dictionary word words: it is based on a dictionary word ------- Test 3 - digital: 'Provoke1pattern2search3by4separating5words' 12345: it is too simplistic/systematic ------- Test 4 - cracklib-check: 'Provoke1pattern2search3by4separating5words' Provoke1pattern2search3by4separating5words: OK ------- Some test result for 'Provoke1pattern2search3by4separating5words' is bad: Some weakness found :-( ##### Run interactively without any parameter ##### $ ./pwdcheck Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase ---------------------------------------------------------------- Enter a password : CandidateContaining4DifferentWords Test 1 - size&mix: 'CandidateContaining4DifferentWords' is long enough CandidateContaining4DifferentWords contains only ASCII letters and digits ------- Test 2 - lexicon: 'CandidateContaining4DifferentWords' no comment ------- Test 3 - digital: 'CandidateContaining4DifferentWords' is good ------- Test 4 - cracklib-check: 'CandidateContaining4DifferentWords' CandidateContaining4DifferentWords: OK ------- Test 5 - manual: Is 'CandidateContaining4DifferentWords' a good or bad password? (g/b) g is good ------- Every test result for 'CandidateContaining4DifferentWords' is good: No weakness found :-) sudodus@xenial32 /media/multimed-2/test/test0/pwdstrength $
1
ответ дан 18 July 2018 в 03:32

Поверхностные проблемы

В вашем скрипте есть несколько проблем. Он ломается, если пароль содержит несколько специальных символов. Попробуйте ввести ввод, например:

a space two spaces a * star ← try this one in different directories bbbbbbbbbb ← try this one in a directory containing a file called a endswithabackslash\

Чтение Почему мой сценарий оболочки задыхается от пробелов или других специальных символов ?. Все это. Не пишите никаких сценариев оболочки, которые дистанционно связаны с безопасностью, пока вы не поймете все это.

Ох и [:alnum:] работают отлично. Вы, вероятно, намеревались написать if [ -z … или if ! [ -n … вместо if ! [ -z ….

Нет такой силы, как сила пароля

Идея «сила пароля» миф. Это миф, который распространяется на многих сайтах, но это все еще миф. Нет такой вещи, как сила пароля, есть только сила процесса генерации пароля.

Наличие специальных символов в пароле не делает его более сильным. Пароль - это компромисс между легкостью запоминания и легкостью взлома, а существует только сила процесса генерации пароля , как анализируется в этом потоке в Security Stack Exchange (рассказ, математика, некоторые дополнения - упражнения: в этом неправильном ответе, какие части полностью игнорируют факты?). Идея о том, что специальные символы делают пароль более сильным, основана на предположении, что люди, которые пишут взломщики паролей, являются идиотами. Угадайте, что: это не так.

Итак, как мне выбрать пароли?

Читайте, почему это нужно сделать, взломав пароли, поэтому вы можете поспорить, что есть люди, которые инвестируют в это. мой сценарий оболочки задыхается от пробелов или других специальных символов? . Если ваш метод выбора пароля не включает в себя источник случайности (с помощью компьютера или прокатки кости, если вам нравится старая школа), это нехорошо.

этот поток на Security Stack Exchange - популярный выбор, но любой метод, который следует за шаблоном XKCD, выбирает несколько «слов» в случайном порядке из некоторого словаря - это хорошо.

Правильный скрипт

#!/bin/sh echo -n "Enter a password : " IFS= read -r password LEN=${#password} if [ "$LEN" -lt 10 ]; then printf "%s is smaller than 10 characters\n" "$password" fi if [ -z "$(printf %s "$password" | tr -d "[:alnum:]")" ]; then printf "%s only contains ASCII letters and digits\n" "$password" else printf "%s contains characters other than ASCII letters and digits\n" "$password" fi

Использование tr таким образом усложняет ситуацию. Оболочка отлично проверяет, содержит ли строка символы из определенного набора.

#!/bin/sh echo -n "Enter a password : " IFS= read -r password LEN=${#password} if [ "$LEN" -lt 10 ]; then printf "%s is smaller than 10 characters\n" "$password" fi case "$password" in *[![:alnum:]]*) printf "%s contains characters other than ASCII letters and digits\n" "$password";; *) printf "%s only contains ASCII letters and digits\n" "$password";; esac

(Обратите внимание, что утверждение о письмах и цифрах ASCII верно для Ubuntu /bin/sh, но в bash [:alnum:] включает все буквы и цифры в текущем регионе, а не только ASCII.)

13
ответ дан 18 July 2018 в 03:32

Наконец, следующий скрипт, который я написал, решил мою проблему:

echo -n "Enter a password : " read password LEN=$(echo ${#password}) if [ $LEN -lt 10 ]; then echo "$password is smaller than 10 characters" else if [ -z `echo $password | tr -d '[:alpha:]' | tr -d '[:upper:]' | tr -d '[:lower:]' ` ] || [ -z `echo $password | tr -d '[:upper:]' | tr -d '[:digit:]' `] || [ -z `echo $password | tr -d '[:lower:]' | tr -d '[:digit:]' `] ; then echo "$password is a weak password" else echo "$password is a strong password" fi fi echo

Спасибо за ваши ребята!

-3
ответ дан 24 July 2018 в 17:52
  • 1
    Я добавил подсветку синтаксиса. Делает скрипты более удобными для чтения. – muru 10 November 2017 в 15:44
  • 2
    О, не видел этого. Просто скопируйте мой ответ еще раз;) изменил его снова. Хотя обычно это делается автоматически, не так ли? – derHugo 10 November 2017 в 15:45
  • 3
    в зависимости от тегов. Если вопрос был отмечен bash, например, все будет выделено как сценарий bash ... Но вопрос не в том, что касается bash. – muru 10 November 2017 в 15:50
  • 4
    У вас слишком много сложностей с использованием функции wc, вы также изменили логику, поскольку, например, пробелы больше не считаются заставляющими пароль «сильным», и вы сохранили множество ошибок из оригинала, таких как обработка a * b в качестве входного сигнала. – Gilles 11 November 2017 в 01:17
  • 5
    Я предлагаю вам прочитать ответ Жиля. У вашего сценария все еще есть серьезные проблемы. – Kevin 11 November 2017 в 03:24

Запах ужасно, как проблема XY для меня. Никогда не пишите свои собственные инструменты для работы с паролями. По крайней мере, вы здесь не занимаетесь хранением паролей, но первое, что приходит в голову с вашим кодом, это то, что я могу ввести пароль с полным номером и считать его «сильным» (когда на самом деле он будет намного слабее чем полный алфавитный пароль). Если вы продолжите этот подход к защите / обработке паролей, вы рано или поздно свалитесь, и это будет не так, когда это произойдет.

Правильное решение - использовать внешнюю библиотеку или вспомогательное приложение для определения силы пароля (и выполнения других задач, связанных с паролем). Большинство систем Linux в наши дни имеют PAM, которые могут безопасно выполнять все связанные с проверкой подлинности задачи (в качестве бонуса вы получаете поддержку других методов проверки подлинности, помимо паролей, в зависимости от того, как настроена система пользователя), и muru уже предложил вспомогательное приложение, определяющее силу пароля.

7
ответ дан 24 July 2018 в 17:52
  • 1
    Это, безусловно, лучший ответ. См. Также askubuntu.com/questions/244115/… – Panther 10 November 2017 в 20:38
  • 2
    да, мой старый банк считает ограничение в 12 символов и не позволяет специальным символам «сильным», но я подозреваю, что большинство экспертов не согласны. использование инструментов, которые обновляются, позволяет вам не отставать от стандартов. – Sam 10 November 2017 в 22:47
  • 3
    Никакое приложение не может определить силу пароля, потому что такой вещи нет. Существует только сила метода генерации пароля , и вы не можете определить силу с одного пароля. – Gilles 11 November 2017 в 01:13

Я нашел правильный скрипт, и он работает:

echo -n "Enter a password : " read password LEN=$(echo ${#password}) if [ $LEN -lt 10 ]; then echo "$password is smaller than 10 characters" else if [ -z `echo $password | tr -d '[:alpha:]' | tr -d '[:upper:]' | tr -d '[:lower:]' ` ]; then echo "$password is a weak password" else echo "$password is a strong password" fi fi echo
-3
ответ дан 24 July 2018 в 17:52
  • 1
    Это все еще не работает для меня - & gt; возвращает allways & quot; сильный пароль & quot; – derHugo 10 November 2017 в 15:10
  • 2
    cracklib-check, похоже, не проверяет (обширные) словари других языков, кроме английского: subsidiary → dictionary word, но немецкий эквивалент subsidiär → OK. – dessert 10 November 2017 в 18:30
  • 3
    В этом случае здесь записана строковая нотация : cracklib-check <<< 1234 – dessert 10 November 2017 в 18:40
  • 4
    @dessert, вероятно, зависит от того, какие словари, которые я установил – muru 11 November 2017 в 00:52
  • 5
    Если cracklib-check считается !foobared123 как «ОК», но foobared123 как «упрощенное», он недостаточно усердствует. Добавление одного символа пунктуации - это детская игра для взломщика паролей. Все cracklib-check действительно отбрасывают некоторые из очень глупых паролей , на самом деле это не говорит о сильном пароле. – Gilles 11 November 2017 в 01:12

Если вы хотите создать хороший метод для создания паролей

См.

Генератор паролей, объединяющий фактические слова

Генератор паролей, объединяющий фактические слова

Ваш вопрос: как проверить силу пароля?

Как применить политику сложности пароля?

Вы можете проверить только определенные аспекты пароля или используйте специальный инструмент для каждого метода для создания пароля или общего метода грубой силы (если злоумышленник не знает метод).

Оболочка pwdcheck с использованием cracklib-check

#!/bin/bash # setting variables usage="Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase" minlen=20 # can be modified here short="is shorter than $minlen characters" goodmix="is long enough" badmix="is too short $usage" separator="-------" # checking parameter if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ $# -gt 1 ]; then echo "${0##*/} uses 'cracklib-check'" echo "----------------------------------------------------------------" echo "Usage: $0 CandidateContaining4DifferentWords" echo "Example: $0 At-least-$minlen-char" echo " $0 'Should.be.selected.via.*random*.process'" echo " $0 'Single-quote-for-1-special-character!'" echo " $0 'FindPatternByDigitalTest123'" echo " $0 'Provoke1pattern2search3by4separating5words'" echo "$usage" exit elif [ $# -eq 0 ]; then echo "$usage" echo "----------------------------------------------------------------" read -p "Enter a password : " password elif [ $# -eq 1 ]; then password="$1" fi # checking and installing if necessary which cracklib-check > /dev/null if [ $? -eq 1 ]; then read -p "Do you want to install 'cracklib-runtime' to get 'cracklib-check'? (y/N) " ans if [ "$ans" == "y" ]; then sudo apt-get update && sudo apt-get install cracklib-runtime fi fi if [ ${#password} -lt $minlen ]; then result="$short" else result="$goodmix" case "$password" in *[![:alnum:]]*) alnm="'$password' contains characters other than ASCII letters and digits";; # result="$badmix";; *) alnm="$password contains only ASCII letters and digits";; esac fi echo "Test 1 - size&mix: '$password' $result" test ${#password} -lt $minlen || echo "$alnm" if [ "$result" == "$badmix" ] || [ "$result" == "$short" ]; then total="is bad" else total='is good' fi echo "$separator" echo "Test 2 - lexicon: '$password'" sed -e 's/[0-9]/123\n/g' -e 's/$//' -e 's/[§!@£$€#¤%/()=?*,;.:_-~ ]/123\n/g' -e 's/$/123/g' \ <<< "$password" | LANG=C cracklib-check |sed 's/123: /: /'| \ grep 'it is based on a dictionary word' if [ $? -ne 0 ]; then echo 'no comment' fi echo "$separator" echo "Test 3 - digital: '$password'" sed -e 's/[[:alpha:]]//g' -e 's/[§!@£$€#¤%/()=?*,;.:_-~ ]//g' -e 's/$/xyz/' \ <<< "$password" | LANG=C cracklib-check |sed 's/xyz: /: /'| \ grep 'it is too simplistic/systematic' if [ $? -eq 0 ]; then total='is bad' else echo 'is good' fi echo "$separator" echo "Test 4 - cracklib-check: '$password'" LANG=C cracklib-check <<< "$password" | tee /dev/stderr | grep ': OK' > /dev/null if [ $? -eq 0 ]; then echo='is good' else total='is bad' fi if [ "$total" == "is good" ]; then echo "$separator" ans= while [ "$ans" != "g" ] && [ "$ans" != "b" ] do read -p "Test 5 - manual: Is '$password' a good or bad password? (g/b) " ans if [ "$ans" == "g" ]; then echo 'is good' elif [ "$ans" == "b" ]; then total='is bad' echo "$total" fi done fi echo "$separator" if [ "$total" == "is good" ]; then echo "Every test result for '$password' $total: No weakness found :-)" else echo "Some test result for '$password' $total: Some weakness found :-(" fi

Текст справки

Запуск в текущем каталоге тестового каталога. где у вас есть файл shellscript,

$ ./pwdcheck -h pwdcheck uses 'cracklib-check' ---------------------------------------------------------------- Usage: ./pwdcheck CandidateContaining4DifferentWords Example: ./pwdcheck At-least-20-char ./pwdcheck 'Should.be.selected.via.*random*.process' ./pwdcheck 'Single-quote-for-1-special-character!' ./pwdcheck 'FindPatternByDigitalTest123' ./pwdcheck 'Provoke1pattern2search3by4separating5words' Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase

Пакет программ cracklib

$ apt-cache policy cracklib-runtime cracklib-runtime: Installerad: 2.9.2-1ubuntu1 Kandidat: 2.9.2-1ubuntu1 Versionstabell: *** 2.9.2-1ubuntu1 500 500 http://se.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages 100 /var/lib/dpkg/status 2.9.2-1build2 500 500 http://se.archive.ubuntu.com/ubuntu xenial/main i386 Packages

Тестирование различных примеров из текста справки

разумно

Ваш ручной осмотр и «тест» могут быть важными, чтобы избежать очень плохих паролей, но если вы использовали автоматический случайный метод с хорошей репутацией, вы должны полагаться на него и избегать подделывания результата, потому что вы, вероятно, сделаете пароль более легким для взлома.

$ ./pwdcheck CandidateContaining4DifferentWords Test 1 - size&mix: 'CandidateContaining4DifferentWords' is long enough CandidateContaining4DifferentWords contains only ASCII letters and digits ------- Test 2 - lexicon: 'CandidateContaining4DifferentWords' no comment ------- Test 3 - digital: 'CandidateContaining4DifferentWords' is good ------- Test 4 - cracklib-check: 'CandidateContaining4DifferentWords' CandidateContaining4DifferentWords: OK ------- Test 5 - manual: Is 'CandidateContaining4DifferentWords' a good or bad password? (g/b) b is bad ------- Some test result for 'CandidateContaining4DifferentWords' is bad: Some weakness found :-( # comment: This password is published here! ##### Short password ##### $ ./pwdcheck At-least-20-char Test 1 - size&mix: 'At-least-20-char' is shorter than 20 characters ------- Test 2 - lexicon: 'At-least-20-char' least: it is based on a dictionary word char: it is based on a dictionary word ------- Test 3 - digital: 'At-least-20-char' is good ------- Test 4 - cracklib-check: 'At-least-20-char' At-least-20-char: OK ------- Some test result for 'At-least-20-char' is bad: Some weakness found :-( ##### Reminder about random process ##### $ ./pwdcheck 'Should.be.selected.via.*random*.process' Test 1 - size&mix: 'Should.be.selected.via.*random*.process' is long enough 'Should.be.selected.via.*random*.process' contains characters other than ASCII letters and digits ------- Test 2 - lexicon: 'Should.be.selected.via.*random*.process' Should: it is based on a dictionary word selected: it is based on a dictionary word via: it is based on a dictionary word random: it is based on a dictionary word process: it is based on a dictionary word ------- Test 3 - digital: 'Should.be.selected.via.*random*.process' is good ------- Test 4 - cracklib-check: 'Should.be.selected.via.*random*.process' Should.be.selected.via.*random*.process: OK ------- Test 5 - manual: Is 'Should.be.selected.via.*random*.process' a good or bad password? (g/b) g is good ------- Every test result for 'Should.be.selected.via.*random*.process' is good: No weakness found :-) # comment: Do not use the password literally ;-) ##### Single quote the password, if you intend to use special characters ##### ##### Words are found by lexicon test (using cracklib-check), and accepted ##### $ ./pwdcheck 'Single-quote-for-1-special-character!' Test 1 - size&mix: 'Single-quote-for-1-special-character!' is long enough 'Single-quote-for-1-special-character!' contains characters other than ASCII letters and digits ------- Test 2 - lexicon: 'Single-quote-for-1-special-character!' Single: it is based on a dictionary word quote: it is based on a dictionary word for: it is based on a dictionary word special: it is based on a dictionary word character: it is based on a dictionary word ------- Test 3 - digital: 'Single-quote-for-1-special-character!' is good ------- Test 4 - cracklib-check: 'Single-quote-for-1-special-character!' Single-quote-for-1-special-character!: OK ------- Test 5 - manual: Is 'Single-quote-for-1-special-character!' a good or bad password? (g/b) b is bad ------- Some test result for 'Single-quote-for-1-special-character!' is bad: Some weakness found :-( ##### Showing how the digital test works (it uses cracklib-check) ##### $ ./pwdcheck 'FindPatternByDigitalTest123' Test 1 - size&mix: 'FindPatternByDigitalTest123' is long enough FindPatternByDigitalTest123 contains only ASCII letters and digits ------- Test 2 - lexicon: 'FindPatternByDigitalTest123' no comment ------- Test 3 - digital: 'FindPatternByDigitalTest123' 123: it is too simplistic/systematic ------- Test 4 - cracklib-check: 'FindPatternByDigitalTest123' FindPatternByDigitalTest123: OK ------- Some test result for 'FindPatternByDigitalTest123' is bad: Some weakness found :-( ##### Showing the lexicon test and the digital test ##### $ ./pwdcheck 'Provoke1pattern2search3by4separating5words' Test 1 - size&mix: 'Provoke1pattern2search3by4separating5words' is long enough Provoke1pattern2search3by4separating5words contains only ASCII letters and digits ------- Test 2 - lexicon: 'Provoke1pattern2search3by4separating5words' Provoke: it is based on a dictionary word pattern: it is based on a dictionary word search: it is based on a dictionary word separating: it is based on a dictionary word words: it is based on a dictionary word ------- Test 3 - digital: 'Provoke1pattern2search3by4separating5words' 12345: it is too simplistic/systematic ------- Test 4 - cracklib-check: 'Provoke1pattern2search3by4separating5words' Provoke1pattern2search3by4separating5words: OK ------- Some test result for 'Provoke1pattern2search3by4separating5words' is bad: Some weakness found :-( ##### Run interactively without any parameter ##### $ ./pwdcheck Use 4 words chosen randomly, see this link: https://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase ---------------------------------------------------------------- Enter a password : CandidateContaining4DifferentWords Test 1 - size&mix: 'CandidateContaining4DifferentWords' is long enough CandidateContaining4DifferentWords contains only ASCII letters and digits ------- Test 2 - lexicon: 'CandidateContaining4DifferentWords' no comment ------- Test 3 - digital: 'CandidateContaining4DifferentWords' is good ------- Test 4 - cracklib-check: 'CandidateContaining4DifferentWords' CandidateContaining4DifferentWords: OK ------- Test 5 - manual: Is 'CandidateContaining4DifferentWords' a good or bad password? (g/b) g is good ------- Every test result for 'CandidateContaining4DifferentWords' is good: No weakness found :-) sudodus@xenial32 /media/multimed-2/test/test0/pwdstrength $
1
ответ дан 24 July 2018 в 17:52
  • 1
    я запускаю его, и он всегда говорит о надежном пароле – Panos Mikael 10 November 2017 в 14:48
  • 2
    Я проверю и изменю его ... – sudodus 10 November 2017 в 14:49
  • 3
    Я тоже пытаюсь! Ждем вашего ответа! – Panos Mikael 10 November 2017 в 14:50
  • 4
    Пароль @sudodus должен быть сильным, если он НЕ ТОЛЬКО содержит alnum. Прямо сейчас вы смотрите, только если у него есть хотя бы один alnum. – derHugo 10 November 2017 в 14:55
  • 5
    Думаю, сейчас лучше. Посмотрим, не нашли ли вы ошибку. – sudodus 10 November 2017 в 15:41

Поверхностные проблемы

В вашем скрипте есть несколько проблем. Он ломается, если пароль содержит несколько специальных символов. Попробуйте ввести ввод, например:

a space two spaces a * star ← try this one in different directories bbbbbbbbbb ← try this one in a directory containing a file called a endswithabackslash\

Чтение Почему мой сценарий оболочки задыхается от пробелов или других специальных символов ?. Все это. Не пишите никаких сценариев оболочки, которые дистанционно связаны с безопасностью, пока вы не поймете все это.

Ох и [:alnum:] работают отлично. Вы, вероятно, намеревались написать if [ -z … или if ! [ -n … вместо if ! [ -z ….

Нет такой силы, как сила пароля

Идея «сила пароля» миф. Это миф, который распространяется на многих сайтах, но это все еще миф. Нет такой вещи, как сила пароля, есть только сила процесса генерации пароля.

Наличие специальных символов в пароле не делает его более сильным. Пароль - это компромисс между легкостью запоминания и легкостью взлома, а существует только сила процесса генерации пароля , как анализируется в этом потоке в Security Stack Exchange (рассказ, математика, некоторые дополнения - упражнения: в этом неправильном ответе, какие части полностью игнорируют факты?). Идея о том, что специальные символы делают пароль более сильным, основана на предположении, что люди, которые пишут взломщики паролей, являются идиотами. Угадайте, что: это не так.

Итак, как мне выбрать пароли?

Читайте, почему это нужно сделать, взломав пароли, поэтому вы можете поспорить, что есть люди, которые инвестируют в это. мой сценарий оболочки задыхается от пробелов или других специальных символов? . Если ваш метод выбора пароля не включает в себя источник случайности (с помощью компьютера или прокатки кости, если вам нравится старая школа), это нехорошо.

этот поток на Security Stack Exchange - популярный выбор, но любой метод, который следует за шаблоном XKCD, выбирает несколько «слов» в случайном порядке из некоторого словаря - это хорошо.

Правильный скрипт

#!/bin/sh echo -n "Enter a password : " IFS= read -r password LEN=${#password} if [ "$LEN" -lt 10 ]; then printf "%s is smaller than 10 characters\n" "$password" fi if [ -z "$(printf %s "$password" | tr -d "[:alnum:]")" ]; then printf "%s only contains ASCII letters and digits\n" "$password" else printf "%s contains characters other than ASCII letters and digits\n" "$password" fi

Использование tr таким образом усложняет ситуацию. Оболочка отлично проверяет, содержит ли строка символы из определенного набора.

#!/bin/sh echo -n "Enter a password : " IFS= read -r password LEN=${#password} if [ "$LEN" -lt 10 ]; then printf "%s is smaller than 10 characters\n" "$password" fi case "$password" in *[![:alnum:]]*) printf "%s contains characters other than ASCII letters and digits\n" "$password";; *) printf "%s only contains ASCII letters and digits\n" "$password";; esac

(Обратите внимание, что утверждение о письмах и цифрах ASCII верно для Ubuntu /bin/sh, но в bash [:alnum:] включает все буквы и цифры в текущем регионе, а не только ASCII.)

13
ответ дан 24 July 2018 в 17:52

Другие вопросы по тегам:

Похожие вопросы: