Консольное приложение для маскировки паролей

Я попробовал следующий код ...

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);

Но таким образом, функция Backspace не работает при вводе пароля. Любое предложение?

186
задан Yahia 7 February 2012 в 07:55
поделиться

4 ответа

Console.Write("\b \b"); удалит символ звездочки с экрана, но у вас нет кода в блоке else, который удаляет ранее введенный символ из строковой переменной pass.

Вот соответствующий рабочий код, который должен сделать то, что вам нужно:

string pass = "";
do
{
    ConsoleKeyInfo key = Console.ReadKey(true);
    // Backspace Should Not Work
    if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
    {
        pass += key.KeyChar;
        Console.Write("*");
    }
    else
    {
        if (key.Key == ConsoleKey.Backspace && pass.Length > 0)
        {
            pass = pass.Substring(0, (pass.Length - 1));
            Console.Write("\b \b");
        }
        else if(key.Key == ConsoleKey.Enter)
        {
            break;
        }
    }
} while (true);
208
ответ дан 23 November 2019 в 05:49
поделиться

Если я правильно понимаю, вы пытаетесь заставить backspace удалить как видимый символ * на экране, так и кешированный символ в вашей переменной pass?

Если да, то просто измените свой блок else на этот:

            else
            {
                Console.Write("\b");
                pass = pass.Remove(pass.Length -1);
            }
-1
ответ дан 23 November 2019 в 05:49
поделиться

Для этого вы должны использовать System.Security.SecureString

public SecureString GetPassword()
{
    var pwd = new SecureString();
    while (true)
    {
        ConsoleKeyInfo i = Console.ReadKey(true);
        if (i.Key == ConsoleKey.Enter)
        {
            break;
        }
        else if (i.Key == ConsoleKey.Backspace)
        {
            if (pwd.Length > 0)
            {
                pwd.RemoveAt(pwd.Length - 1);
                Console.Write("\b \b");
            }
        }
        else if (i.KeyChar != '\u0000' ) // KeyChar == '\u0000' if the key pressed does not correspond to a printable character, e.g. F1, Pause-Break, etc
        {
            pwd.AppendChar(i.KeyChar);
            Console.Write("*");
        }
    }
    return pwd;
}
88
ответ дан 23 November 2019 в 05:49
поделиться

Вы можете добавлять свои ключи в накапливающийся связанный список.

Когда получена клавиша возврата, удалить последнюю клавишу из списка.

Получив клавишу ввода, сверните список в строку и выполните остальную работу.

1
ответ дан 23 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: