Eu tentei o seguinte código ...
string pass = "";
Console.Write("Enter your password: ");
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
// Backspace Should Not Work
if (key.Key != ConsoleKey.Backspace)
{
pass += key.KeyChar;
Console.Write("*");
}
else
{
Console.Write("\b");
}
}
// Stops Receving Keys Once Enter is Pressed
while (key.Key != ConsoleKey.Enter);
Console.WriteLine();
Console.WriteLine("The Password You entered is : " + pass);
Mas dessa forma, a funcionalidade de backspace não funciona ao digitar a senha. Alguma sugestão?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
fonte
fonte
Respostas:
Console.Write("\b \b");
excluirá o caractere asterisco da tela, mas você não possui nenhum código em seuelse
bloco que remova o caractere inserido anteriormente da suapass
variável de cadeia.Aqui está o código de trabalho relevante que deve fazer o que você precisa:
fonte
' '
) entre os caracteres de backspace ('\b'
)."\b \b"
leva você para um lugar de volta, depois imprime um espaço (que leva você para um lugar para a frente) e depois para você de novo, para que você acabe onde'*'
estava o caractere excluído .\b
move o cursor para trás uma posição (agora abaixo do último*
caractere. O[space]
caractere "imprime" o asterisco, mas também move o cursor um caracter para a frente novamente, de modo que o último\b
move o cursor de volta para onde o último*
costumava ser! (Ufa - esperança que faz sentido!)if (pass.Length > 0)
deve serif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
de outra forma você não vai obter o último caractere da senha ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
porif (!char.IsControl(key.KeyChar))
.Para isso, você deve usar o System.Security.SecureString
fonte
if( pwd.Length > 0)
na primeira declaração mais para impedir que as pessoas excluindo a questão :)else
cláusula final se beneficiaria de um testeif (!char.IsControl(i.KeyChar))
(ou pelo menosif (i.KeyChar != '\u0000')
).Solução completa, baunilha C # .net 3.5+
Cortar e colar :)
fonte
Tomando a resposta principal, bem como as sugestões de seus comentários, e modificando-a para usar o SecureString em vez de String, teste todas as chaves de controle e não faça erros ou escreva um "*" extra na tela quando o tamanho da senha for 0, minha solução é:
fonte
O meu ignora os caracteres de controle e manipula a quebra de linha:
fonte
DELETE
caractere apague todo o texto digitado. Sua sequência de teclas éCTRL + BACKSPACE
e seu código de char é0x7f
.A leitura da entrada do console é difícil, você precisa manipular teclas especiais como Ctrl, Alt, também as teclas do cursor e Backspace / Delete. Em alguns layouts de teclado, como o Ctrl sueco é necessário até mesmo para digitar as teclas que existem diretamente no teclado dos EUA. Eu acredito que tentar lidar com isso usando o "nível baixo"
Console.ReadKey(true)
é muito difícil, então a maneira mais fácil e robusta é apenas desativar o "eco da entrada do console" durante a digitação da senha usando um pouco de WINAPI.O exemplo abaixo é baseado na resposta à pergunta Leia uma senha da pergunta std :: cin .
fonte
Isso oculta a senha com um quadrado vermelho e volta para as cores originais assim que a senha for inserida.
Não impede que o usuário use copiar / colar para obter a senha, mas se é mais para impedir alguém de olhar por cima do ombro, esta é uma boa solução rápida.
fonte
Console.CursorVisible=false
e configurá-lo de volta ao valor anterior depois. Isso impediria que alguém aumentasse o tamanho da senha.Encontrei um bug na solução .NET de baunilha C # 3.5 do shermy que, de outra forma, funciona como um encanto. Também incorporei a idéia do SecureString de Damian Leszczyński - Vash aqui, mas você pode usar uma sequência comum, se preferir.
O erro: se você pressionar backspace durante o prompt de senha e o comprimento atual da senha for 0, um asterisco será inserido incorretamente na máscara de senha. Para corrigir esse bug, modifique o seguinte método.
fonte
Aqui está uma versão que adiciona suporte à
Escape
chave (que retorna umanull
string)fonte
Pacote (My) nuget para fazer isso, com base na resposta superior:
install-package PanoramicData.ConsoleExtensions
Uso:
URL do projeto: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Solicitações pull bem-vindas.
fonte
Você pode anexar suas chaves a uma lista vinculada acumulada.
Quando uma chave de backspace for recebida, remova a última chave da lista.
Quando você receber a tecla Enter, recolha sua lista em uma sequência e faça o resto do seu trabalho.
fonte
Fiz algumas alterações no backspace
fonte
Aqui está a minha versão simples. Toda vez que você pressionar uma tecla, exclua tudo do console e desenhe quantos '*' forem o comprimento da string da senha.
fonte
Eu atualizei a versão de Ronnie depois de passar muito tempo tentando digitar uma senha apenas para descobrir que eu estava com meu CAPS LOCK!
Com esta versão, o que quer que seja que a mensagem esteja
_CapsLockMessage
"flutuará" no final da área de digitação e será exibido em vermelho.Esta versão requer um pouco mais de código e requer um loop de sondagem. No meu computador, o uso da CPU é de 3% a 4%, mas sempre é possível adicionar um pequeno valor de Sleep () para diminuir o uso da CPU, se necessário.
fonte
Se eu entendi isso corretamente, você está tentando fazer com que o backspace exclua o caractere visível * na tela e o caractere em cache na sua variável de passe?
Nesse caso, basta alterar seu bloco else para este:
fonte
fonte