protected static string ReadPassword() { var pwd = new Stack <char>(); var filtered = new ConsoleKey[] { ConsoleKey.Tab, ConsoleKey.Spacebar, ConsoleKey.Enter, ConsoleKey.Escape }; ConsoleKeyInfo key; do { key = Console.ReadKey(true); // ctrl+backsp if (key.Key == ConsoleKey.Backspace && key.Modifiers.HasFlag(ConsoleModifiers.Control)) { while (pwd.Count > 0) { Console.Write("\b \b"); pwd.Pop(); } } // backsp else if (key.Key == ConsoleKey.Backspace) { if (pwd.Count > 0) { Console.Write("\b \b"); pwd.Pop(); } } // '\u0000' if the key pressed does not correspond to a printable character, e.g. F1, Pause-Break, etc else if (key.KeyChar != '\u0000' && !filtered.Any(k => k == key.Key)) { pwd.Push(key.KeyChar); Console.Write("*"); } } while (key.Key != ConsoleKey.Enter); Console.WriteLine(); return(new string(pwd.Reverse().ToArray())); }