Esqueceu o script bash da opção de senha

0

Estou tentando criar um script que gere uma senha. O script também possui uma opção "Esqueci minha senha". Como a senha tem caracteres aleatórios, é difícil lembrar, portanto, quando um usuário esquece o passe, ele pode ser regenerado, mas, é claro, é preciso haver perguntas de segurança.

Eu descobri a parte em que posso fazer 3 perguntas ao usuário e gerar uma senha. Por exemplo: nome de usuário, comida favorita e url. A parte que não consigo descobrir é onde um usuário pode regenerar a senha. Eu acho que preciso de alguma forma armazenar 3 variáveis (nome de usuário, favoriteFood, url), mas não tenho idéia de como. Este é o código que eu tenho:

#!/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
    
por abc123 10.12.2016 / 14:04

1 resposta

3

Se você deseja reproduzir a mesma senha gerada se o usuário inserir as mesmas 3 respostas novamente, apenas não crie uma senha aleatória, mas deduza a senha apenas das respostas. Dessa forma, sua senha não é mais verdadeiramente aleatória, mas apenas pseudo-aleatória (parece aleatória para humanos, mas é determinada apenas pela entrada), mas é provavelmente um problema de segurança menor do que armazenar as senhas em texto simples em um banco de dados de senhas.

Eu escrevi um pequeno exemplo que leva em 3 respostas $answer1 , $answer2 , $answer3 e um parâmetro numérico $length que determina o comprimento da senha de saída (máx. 86 caracteres):

$ 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

O comando parece complicado, mas como funciona é bem fácil:

  • printf '%s-%s-%s%n' "$answer1" "$answer2" "$answer3" simplesmente concatena as três sequências de respostas usando - como delimitador e adicionando uma nova linha. Você pode usar qualquer outro método que converta sua entrada de usuário em uma única string, não importa, contanto que você sempre use o mesmo.
  • sha512sum lê a entrada padrão (onde a saída do comando acima é canalizada) e calcula o hash SHA-512 dela. Esta é uma string de 129 caracteres hexadecimais (0 a 9, a-f).
  • xxd -r -p converte os caracteres hexadecimais em código binário.
  • base64 -w0 converte o código binário para Base 64 (a-z, A-Z, 0-9, +, /).
  • grep -Eo "^.{$length}" imprime os primeiros $length caracteres do resultado. Você não deve especificar um comprimento maior que 86 (há 88 caracteres, mas os dois últimos sempre serão == ).
por Byte Commander 10.12.2016 / 15:11