Программа проверки пароля

Я арестовываю голову на этом долгое время. Эта программа средства проверки пароля гарантирует, что данный пароль включает:

  • И прописные и строчные буквы
  • По крайней мере 10 цифр
  • По крайней мере одно число

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

#!/bin/bash

echo "Please enter password: "
read user_passwd
flaglng=0
flagcap=0
flagncap=0
flagnum=0
if [[ ${#user_passwd} -ge 10 ]]; then
    flaglng=1
fi

if [[ "$user_passwd" = *[A-Z]* ]]; then
    flagcap=1
fi

if [[ "$user_passwd" = *[a-z]* ]]; then
    flagncap=1
fi

if [[ "$user_passwd" = *[0-9]* ]]; then
    flagnum=1
fi

if [[ "$flaglng" == 1 && "$flagcap" == 1 && "$flagncap" == 1 && "$flagnum" == 1 ]]; then
     echo "Password Strong!"
fi

if [[ "$flaglng" = 0 ]]; then
   echo "Weak Password! It should include at least 10 characters."
fi

if [[ "$flagcap" = 0 ]]; then
    echo "Weak Password! It should include at least 1 upper case letter."
fi

if [[ "$flagncap" = 0 ]]; then
    echo "Weak Password! It should include at least 1 lower case letter."
fi

if [[ "$flagnum" = 0 ]]; then
    echo "Weak Password! It should include at least 1 number."
fi
3
задан 15 November 2017 в 16:31

2 ответа

Каждый раз, когда Вы работаете с диапазонами символов, это - очень хорошая идея вставить export LC_ALL=C (или C.UTF-8 если Вы нуждаетесь в поддержке для символов вне диапазона ASCII) в начале сценария, иначе Вы можете быть удивлены какой A-Z и a-z средний...

Например:

$ unset LC_ALL
$ export LANG=en_US.UTF-8
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
Match
$ export LC_ALL=C
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
No match

Оболочка берет диапазон [A-Z] означать все символы который вид между A и Z в текущей локали. В en_US локаль b виды между A и Z; следовательно abc соответствия *[A-Z]*. С другой стороны, в C локаль b не сортирует между A и Z, потому что в C вид символов локали строго в соответствии с их кодовой точкой.

9
ответ дан 17 November 2019 в 09:08

Во-первых, Вам не нужно это многие ветвление ifs. Как, вообще. Вместо этого сделайте что-то вроде этого:

goodpassword=1

...

if [[ "$user_passwd" = *[A-Z]* ]]; then 
    echo "Weak Password! It should include at least 1 upper case letter."
    goodpassword=0
fi

...

if [[ "$goodpassword" = 1 ]]; then
    echo "Good password!"
fi

Для устранения проблемы с шариками используйте регулярные выражения вместо этого. Отбросьте * и используйте ~.

if [[ "$user_passwd" =~ [A-Z] ]]; then 
    flagcap=1
fi

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

Образец:

$ ./pwcheck.sh 
Please enter password : 
a
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 upper case letter.
Weak Password! It should include at least 1 number.

$ ./pwcheck.sh 
Please enter password : 
A
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 lower case letter.
Weak Password! It should include at least 1 number.
9
ответ дан 17 November 2019 в 09:08

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

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