Я пытаюсь сделать сценарий удара, который генерирует пароль. Сценарий также имеет опцию "Forgot password". Поскольку пароль имеет случайные символы, трудно помнить, поэтому когда пользователь забывает передачу, это может быть повторно создано, но, конечно, там иметь, чтобы быть вопросами о безопасности.
Я выяснил часть, где я могу задать пользователю 3 вопроса и генерировать пароль. Например: имя пользователя, любимая еда и URL. Первая часть, может казаться, не выясняет, то, где пользователь может повторно создать пароль. Я думаю, что должен так или иначе сохранить 3 переменные (имя пользователя, favoriteFood, URL), но я понятия не имею как. Это - код, который я имею:
#!/bin/bash
pause(){
read -p "Press [Enter] key to continue..." fackEnterKey
}
one(){
echo "Enter your usename"
read username
echo "Whats your favorite food"
read favoriteFood
echo "Enter URL"
read url
choose() { echo ${1:RANDOM%${#1}:1} $RANDOM; }
pass="$({ choose '!@#$%^\&'
choose '0123456789'
choose 'abcdefghijklmnopqrstuvwxyz'
choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in $( seq 1 $(( 4 + RANDOM % 8 )) )
do
choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
done
} | sort -R | awk '{printf "%s",$1}')"
echo "Your pass is:"$pass
pause
}
#this is the part where i am stuck
two(){
echo "Enter username"
read username2
echo "Whats your favorite food"
read favoriteFood2
echo "Enter URL"
read url2
if [ username==username2 -a favoriteFood==favoriteFood2 -a url==url2 ] #this only works if the scirpt is not closed.
then
echo $pass
else
echo "not found"
fi
pause
}
show_menus() {
clear
echo "~~~~~~~~~~~~~~~~~~~~~"
echo " M A I N - M E N U"
echo "~~~~~~~~~~~~~~~~~~~~~"
echo "1. Generate password"
echo "2. Forgot password"
echo "3. Exit"
}
read_options(){
local choice
read -p "Enter choice [ 1 - 3] " choice
case $choice in
1) one ;;
2) two ;;
3) exit 0;;
*) echo -e "${RED}Error...${STD}" && sleep 2
esac
}
trap '' SIGINT SIGQUIT SIGTSTP
while true
do
show_menus
read_options
done
Если Вы хотите смочь воспроизвести тот же сгенерированный пароль, если пользователь вводит те же 3 ответа снова, просто не создавайте случайный пароль, но получайте пароль на основании ответов только. Тем путем Ваш пароль больше не является действительно случайным, но только псевдослучайным (кажется случайным людям, но определяется только входом), но это вероятно меньшая проблема безопасности, чем хранение паролей в простом тексте в базе данных пароля.
я записал короткий пример, который берет в 3 ответах $answer1
, $answer2
, $answer3
и числовое $length
параметр, который определяет выходную длину пароля (максимум 86 символов):
$ answer1=bytecommander
$ answer2=pizza
$ answer3=askubuntu.com
$ length=12
$ printf '%s-%s-%s%n' "$answer1" "$answer2" "$answer3" | sha512sum | xxd -r -p | base64 -w0 | grep -Eo "^.{$length}"
fBuIlC+lXiuW
команда выглядит сложной, но как она работает, на самом деле довольно легко:
printf '%s-%s-%s%n' "$answer1" "$answer2" "$answer3"
просто связывают три строки ответа вместе с помощью -
как разделитель и добавляя новую строку. Можно использовать любой другой метод, который преобразовывает ввод данных пользователем в одну единственную строку, это не имеет значения, пока Вы просто всегда используете то же. sha512sum
чтения от стандартного входа (где вывод команды выше передается по каналу) и вычисляет хеш SHA-512 его. Это - строка 129 шестнадцатеричных (0-9, a-f) символы. xxd -r -p
преобразовывает шестнадцатеричные символы в двоичный код. base64 -w0
преобразовывает двоичный код для Базирования 64 (a-z, A-Z, 0-9, +,/). grep -Eo "^.{$length}"
печать первое $length
символы результата. Вы не должны указывать длину, больше, чем 86 (существует 88 символов, но последние два всегда будут ==
).