Ich habe den folgenden Code ausprobiert ...
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);
Auf diese Weise funktioniert die Rücktaste beim Eingeben des Kennworts jedoch nicht. Irgendein Vorschlag?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
quelle
quelle
Antworten:
Console.Write("\b \b");
löscht das Sternchen vom Bildschirm, aber Sie haben keinen Code in Ihremelse
Block, der das zuvor eingegebene Zeichen aus Ihrerpass
Zeichenfolgenvariablen entfernt.Hier ist der relevante Arbeitscode, der das tun sollte, was Sie benötigen:
quelle
' '
) zwischen den Rücktastezeichen ('\b'
)."\b \b"
Nimmt Sie einen Platz zurück, druckt dann ein Leerzeichen (das Sie einen Platz vorwärts bringt) und bringt Sie dann wieder zurück, sodass Sie dort landen, wo sich das gelöschte'*'
Zeichen befand.\b
bewegt den Cursor eine Position nach hinten (jetzt unter dem letzten*
Zeichen der.[space]
Zeichen „druckt über“ das Sternchen, sondern bewegt sich auch der Cursor um ein Zeichen nach vorne wieder, so die letzten\b
bewegt den Cursor zurück, wo der letzte*
verwendet sei! (Puh - Hoffe das macht Sinn!)if (pass.Length > 0)
sollteif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
sonst sein, erhalten Sie nicht das letzte Zeichen des Passworts ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
mitif (!char.IsControl(key.KeyChar))
.Verwenden Sie dazu den System.Security.SecureString
quelle
if( pwd.Length > 0)
in die erste else-Anweisung einnisten , um zu verhindern, dass Leute die Frage löschen :)else
würde die letzte Klausel von einem Testif (!char.IsControl(i.KeyChar))
(oder zumindestif (i.KeyChar != '\u0000')
) profitieren .Komplettlösung, Vanille C # .net 3.5+
Ausschneiden Einfügen :)
quelle
Nehmen Sie die oberste Antwort sowie die Vorschläge aus den Kommentaren und ändern Sie sie, um SecureString anstelle von String zu verwenden. Testen Sie alle Steuerschlüssel, und geben Sie keine Fehler ein oder schreiben Sie ein zusätzliches "*" auf den Bildschirm, wenn die Kennwortlänge 0 ist. Meine Lösung ist:
quelle
Meins ignoriert Steuerzeichen und behandelt Zeilenumbrüche:
quelle
DELETE
Zeichen den gesamten eingegebenen Text löscht. Die Tastenfolge lautetCTRL + BACKSPACE
und der Zeichencode lautet0x7f
.Das Lesen der Konsoleneingabe ist schwierig. Sie müssen spezielle Tasten wie Strg, Alt, auch Cursortasten und Rücktaste / Löschen verwenden. Bei einigen Tastaturlayouts wie der schwedischen Strg-Taste wird sogar die Eingabe von Tasten benötigt, die direkt auf der US-Tastatur vorhanden sind. Ich glaube, dass der Versuch, dies mit dem "Low-Level" zu handhaben,
Console.ReadKey(true)
nur sehr schwierig ist. Daher ist es am einfachsten und robustesten, das "Konsoleneingabe-Echo" während der Eingabe des Passworts mit etwas WINAPI zu deaktivieren.Das folgende Beispiel basiert auf der Antwort auf die Frage " Passwort aus std :: cin lesen" .
quelle
Dadurch wird das Kennwort mit einem roten Quadrat maskiert und nach Eingabe des Kennworts auf die ursprünglichen Farben zurückgesetzt.
Es hindert den Benutzer nicht daran, das Kennwort durch Kopieren / Einfügen abzurufen. Wenn es jedoch nur darum geht, jemanden davon abzuhalten, über die Schulter zu schauen, ist dies eine gute schnelle Lösung.
quelle
Console.CursorVisible=false
und danach auf den vorherigen Wert zurücksetzen. Dies würde verhindern, dass jemand die Kennwortlänge erreicht.Ich habe einen Fehler in Shermys Vanilla C # 3.5 .NET-Lösung gefunden, der ansonsten einen Reiz hat. Ich habe hier auch Damian Leszczyński - Vashs SecureString-Idee aufgenommen, aber Sie können eine gewöhnliche Saite verwenden, wenn Sie es vorziehen.
DER BUG: Wenn Sie während der Passwortabfrage die Rücktaste drücken und die aktuelle Länge des Passworts 0 ist, wird ein Sternchen falsch in die Passwortmaske eingefügt. Um diesen Fehler zu beheben, ändern Sie die folgende Methode.
quelle
Hier ist eine Version, die Unterstützung für den
Escape
Schlüssel hinzufügt (der einenull
Zeichenfolge zurückgibt ).quelle
(Mein) Nuget-Paket, um dies zu tun, basierend auf der Top-Antwort:
install-package PanoramicData.ConsoleExtensions
Verwendung:
Projekt-URL: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Pull-Anfragen willkommen.
quelle
Sie können Ihre Schlüssel an eine akkumulierte verknüpfte Liste anhängen.
Wenn eine Rücktaste empfangen wird, entfernen Sie den letzten Schlüssel aus der Liste.
Wenn Sie die Eingabetaste erhalten, reduzieren Sie Ihre Liste zu einer Zeichenfolge und erledigen Sie den Rest Ihrer Arbeit.
quelle
Ich habe einige Änderungen für die Rücktaste vorgenommen
quelle
Hier ist meine einfache Version. Löschen Sie jedes Mal, wenn Sie eine Taste drücken, alle Elemente von der Konsole und zeichnen Sie so viele '*', wie die Länge der Kennwortzeichenfolge beträgt.
quelle
Ich habe Ronnies Version aktualisiert, nachdem ich viel zu viel Zeit verbracht habe damit verbracht habe, ein Passwort einzugeben, nur um herauszufinden, dass ich mein CAPS LOCK aktiviert hatte!
Bei dieser Version
_CapsLockMessage
"schwebt" die Nachricht am Ende des Eingabebereichs und wird rot angezeigt.Diese Version benötigt etwas mehr Code und erfordert eine Abfrageschleife. Auf meinem Computer ist die CPU-Auslastung zwischen 3% und 4%, aber man kann immer einen kleinen Sleep () -Wert hinzufügen, um die CPU-Auslastung bei Bedarf zu verringern.
quelle
Wenn ich das richtig verstehe, versuchen Sie, die Rücktaste dazu zu bringen, sowohl das sichtbare * Zeichen auf dem Bildschirm als auch das zwischengespeicherte Zeichen in Ihrer Passvariablen zu löschen?
Wenn ja, ändern Sie einfach Ihren else-Block in diesen:
quelle
quelle