忘记密码选项 bash 脚本

忘记密码选项 bash 脚本

我正在尝试编写一个可以生成密码的 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 个字符,但最后两个字符始终为==)。

相关内容