Intenté el siguiente 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);
Pero de esta manera la funcionalidad de retroceso no funciona al escribir la contraseña. ¿Cualquier sugerencia?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
fuente
fuente
Respuestas:
Console.Write("\b \b");
eliminará el carácter de asterisco de la pantalla, pero no tiene ningún código dentro de suelse
bloque que elimine el carácter ingresado previamente de supass
variable de cadena.Aquí está el código de trabajo relevante que debe hacer lo que necesita:
fuente
' '
) entre los caracteres de retroceso ('\b'
)."\b \b"
lo lleva a un lugar hacia atrás, luego imprime un espacio (que lo lleva a un lugar hacia adelante) y luego lo lleva de nuevo, para que termine donde estaba el'*'
carácter eliminado .\b
se mueve el cursor una posición hacia atrás (ahora por debajo de la última*
Char Los.[space]
"Imprime más de" carácter del asterisco, pero también se mueve el cursor un carácter hacia adelante de nuevo, por lo que los últimos\b
movimientos del cursor a la parte de atrás donde el último*
usado para be! (Uf - ¡Espero que tenga sentido!)if (pass.Length > 0)
debería ser deif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
otra manera no obtendrá el último carácter de la contraseña ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
porif (!char.IsControl(key.KeyChar))
.Para esto, debe usar System.Security.SecureString
fuente
if( pwd.Length > 0)
en la primera declaración para evitar que la gente elimine la pregunta :)else
cláusula final se beneficiaría de una pruebaif (!char.IsControl(i.KeyChar))
(o al menosif (i.KeyChar != '\u0000')
).Solución completa, Vanilla C # .net 3.5+
Cortar pegar :)
fuente
Tomando la respuesta principal, así como las sugerencias de sus comentarios, y modificándola para usar SecureString en lugar de String, pruebe todas las teclas de control y no cometa errores o escriba un "*" extra en la pantalla cuando la longitud de la contraseña sea 0, mi solución es:
fuente
El mío ignora los caracteres de control y maneja el ajuste de línea:
fuente
DELETE
personaje borre todo el texto ingresado. Su secuencia de teclas esCTRL + BACKSPACE
y su código char es0x7f
.Leer la entrada de la consola es difícil, necesita manejar teclas especiales como Ctrl, Alt, también teclas de cursor y Retroceso / Eliminar. En algunos diseños de teclado, como el Ctrl sueco, incluso es necesario para ingresar teclas que existen directamente en el teclado de EE. UU. Creo que tratar de manejar esto usando el "bajo nivel"
Console.ReadKey(true)
es muy difícil, por lo que la forma más fácil y más robusta es simplemente deshabilitar el "eco de entrada de la consola" al ingresar la contraseña con un poco de WINAPI.El siguiente ejemplo se basa en la respuesta a Leer una contraseña de la pregunta std :: cin .
fuente
Esto enmascara la contraseña con un cuadrado rojo, luego vuelve a los colores originales una vez que se ha ingresado la contraseña.
No impide que el usuario use copiar / pegar para obtener la contraseña, pero si se trata más bien de detener a alguien que mira por encima de su hombro, esta es una buena solución rápida.
fuente
Console.CursorVisible=false
y volver a establecerlo en el valor anterior. Esto evitaría que alguien alcanzara el pico en la longitud de la contraseña.Encontré un error en la solución vainilla C # 3.5 .NET de Shermy que de lo contrario funciona a la perfección. También he incorporado Damian Leszczyński - la idea SecureString de Vash aquí, pero puedes usar una cadena normal si lo prefieres.
EL ERROR: Si presiona la tecla de retroceso durante la solicitud de contraseña y la longitud actual de la contraseña es 0, entonces se inserta incorrectamente un asterisco en la máscara de contraseña. Para corregir este error, modifique el siguiente método.
fuente
Aquí hay una versión que agrega soporte para la
Escape
clave (que devuelve unanull
cadena)fuente
(Mi) paquete nuget para hacer esto, basado en la respuesta principal:
install-package PanoramicData.ConsoleExtensions
Uso:
URL del proyecto: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Solicitudes de extracción bienvenidas.
fuente
Puede agregar sus claves a una lista vinculada acumulada.
Cuando se recibe una tecla de retroceso, elimine la última tecla de la lista.
Cuando reciba la tecla Intro, contraiga su lista en una cadena y haga el resto de su trabajo.
fuente
Hice algunos cambios para retroceder
fuente
Aquí está mi versión simple. Cada vez que presiona una tecla, elimine todo de la consola y dibuje tantos '*' como la longitud de la cadena de contraseña.
fuente
¡He actualizado la versión de Ronnie después de pasar demasiado tiempo tratando de ingresar una contraseña solo para descubrir que tenía mi BLOQ MAYÚS activado!
Con esta versión, el mensaje
_CapsLockMessage
"flotará" al final del área de escritura y se mostrará en rojo.Esta versión requiere un poco más de código y requiere un bucle de sondeo. En mi computadora, el uso de CPU es de aproximadamente 3% a 4%, pero siempre se puede agregar un pequeño valor Sleep () para disminuir el uso de CPU si es necesario.
fuente
Si entiendo esto correctamente, ¿está tratando de hacer que la tecla de retroceso elimine tanto el carácter visible * en la pantalla como el carácter en caché en su variable de paso?
Si es así, simplemente cambie su bloque else a esto:
fuente
fuente