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==
).