我正在尝试编写一个可以生成密码的 bash 脚本。该脚本还具有“忘记密码”选项。由于密码包含随机字符,因此很难记住,因此当用户忘记密码时可以重新生成密码,但当然必须有安全问题。
我找到了可以向用户询问 3 个问题并生成密码的部分。例如:用户名、最喜欢的食物和网址。我似乎无法弄清楚的部分是用户可以在哪里重新生成密码。我想我需要以某种方式存储 3 个变量(用户名、最喜欢的食物、网址),但我不知道如何存储。这是我的代码:
#!/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
答案1
如果您希望能够在用户再次输入相同的 3 个答案时重现相同的密码,那么不要创建随机密码,而只从答案中得出密码。这样,您的密码就不再是真正随机的,而只是伪随机的(对人类来说似乎是随机的,但仅由输入决定),但这可能比将密码以纯文本形式存储在密码数据库中的安全问题要小。
我写了一个简短的例子,它接受了 3 个答案$answer1
、$answer2
和一个确定输出密码长度的$answer3
数字参数(最多 86 个字符):$length
$ 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,af)字符组成的字符串。xxd -r -p
将十六进制字符转换为二进制代码。base64 -w0
将二进制代码转换为 Base 64 (az、AZ、0-9、+、/)。grep -Eo "^.{$length}"
打印$length
结果的前几个字符。您不应指定大于 86 的长度(共有 88 个字符,但最后两个字符始终为==
)。