Muitas vezes estamos desenvolvendo uma aplicação que interage com usuário solicitando a senha e se ele estiver fazendo isso com a presença de alguém ou gravando um vídeo, a senha irá aparecer.
Na maioria dos sistemas tipo UNIX isso já é escondido por padrão. Então vamos ver como fazer isso com C++ .
Para isso vamos precisar incluir os seguintes cabeçalhos:
A iostream
já é conhecida e comumente utilizada por nós.
Já a termios.h
é uma biblioteca que contém as definições usadas pelas interfaces de E/S do terminal , será com ela que iremos esconder o digitado.
E o unistd.h
é uma biblioteca que fornece acesso à API do sistema operacional POSIX e torna compatível com qualquer sistema operacional e compilador.
Após adicionar os cabeçalhos, basta:
termios
tcgetattr()
termios
, mas dessa vez para replicarmos os dados da instância anterior para podermos alterartcsetattr()
após estabelecer a regra: newt.c_lflag &= ~ECHO;
std::cout
, getline()
e std::cin
, armazenando em uma variável pré declaradatcsetattr
, mas para devolvermos à instância inicial.
Além disso no código adicionamos a exibição dos dados(na mesma linha com
\r
) digitados só por questões didáticas.
O código em resumo fica assim
vim hidden.cpp
Compile e rode:
g++ hidden.cpp && ./a.out
Exemplo:
Esconde input, mostra senha.
Se durante o std::cout
opcional você ainda quiser trocar a std::string
por asteriscos(*
), adicione esse trecho ao seu código:
Aparecerá:
Sua senha é: ************
.
Exemplo:
Esconde input, mostra asteriscos.
Podemos notar que o comando no terminal stty -echo
(para esconder os dados digitados no terminal) e stty echo
para retornar a exibição faz a mesma coisa. Nota-se que o programa/comando stty
faz uso da biblioteca termios.h
.
Eu vejo muita gente fazendo essa pergunta no StackOverflow e sinceramente nunca vi uma solução eficaz que realmente resolva do jeito que a pessoa deseja, nem usando a biblioteca curses.h
(Observação, curses.h
, compila também com: -lcurses -ltinfo
, não é NCURSES) .
Então, eu criei uma forma que resolve isso de maneira simples, utilizando do while
, excluindo o getline()
e utilizando getchar()
no lugar:
Só que a mágica está na linha:
newt.c_lflag &= 'a';
, eu troquei o~ECHO
por qualquer letra/caractere, nesse o'a'
.
Aparecerá:
Informe sua senha: ************
, ou seja, asteriscos em vez de vazio.
Exemplo:
Input asteriscos, mostra senha.