En el post de hoy vamos a leer una cadena usando C (compatible con C++) pero no vamos a mostrarla, simplemente vamos a mostrar asteriscos o cualquier otro carácter mientras el usuario escribe.

Esto será hecho en C con MinGW en Windows pero lo he probado igual con Dev-C++. Al final tendremos un programa que va a solicitar una contraseña, no la va a mostrar y mostrará asteriscos en su lugar.

Pequeña nota de seguridad

Ya no deberíamos usar C para cosas de seguridad. Sí, sé que varias cosas están programadas con C (librerías, paquetes, núcleos de sistemas operativos) y que si lo usamos bien no habrá problema, pero ya no es recomendable.

Yo hago este tutorial por si tu profesor quiere enseñarte las bases y hacerte sufrir pensando en el algoritmo, pero ya no deberíamos manejar contraseñas con C al menos que sea para tareas o cosas divertidas.

Explicando el algoritmo

Necesitamos una forma de leer cada carácter o tecla presionada sin que el usuario presione Enter. En Windows existe getch, que nos da la tecla presionada, misma que fácilmente puede ser convertida a char.

Por cada carácter leído lo convertimos a cadena y lo concatenamos a la contraseña leída.

Estoy manejando 2 casos especiales: cuando se presiona la tecla de borrado y cuando se presiona Enter; en ese caso los códigos de las mismas son 8 y 13 respectivamente.

Leer contraseña en C sin mostrar caracteres escritos (mostrar asteriscos)

Cuando se presiona la tecla de borrado, eliminamos el último carácter de nuestra cadena. Y cuando se presiona Enter suponemos que el usuario terminó de escribir su contraseña.

Finalmente, cada que el usuario presiona una tecla limpiamos la pantalla y enmascaramos la cadena. Esto solo es necesario si enmascaras la cadena.

Nota: seguramente debe haber algunas teclas que no estoy tomando en cuenta, por ejemplo si el usuario quiere mover la posición del cursor con una tecla de dirección, o cosas de esas.

Leer contraseña en C

Vamos a la función. He encerrado todo el comportamiento en un método para poder invocarlo cuantas veces sea necesario.

Por cierto, esta función no regresa la cadena, simplemente coloca la contraseña en la cadena de destino que tú le indiques, por lo que debes declarar la string antes y enviar el apuntador a la misma.

See the gist on github.

Hacemos un ciclo que se va a detener cuando el usuario presione Enter. Dentro del ciclo vemos si el usuario presionó el backspace para eliminar el último char, y en caso de que no, vemos si presionó algo distinto al Enter para concatenar ese carácter a la contraseña.

Fíjate en que tenemos dos funciones extras: la de enmascarar la cadena (que hace tiempo también hice con Arduino) y la que limpia la pantalla.

Enmascarar cadena

Para mostrar asteriscos en lugar de la cadena real, simplemente imprimimos un carácter desde 0 hasta la longitud de la cadena menos 1. Así:

See the gist on github.

Limpiar pantalla

Existen varias formas de limpiar la pantalla, y también depende de la plataforma, terminal, sistema operativo y creo que también del estado de ánimo del programador.

Yo he usado la siguiente función:

See the gist on github.

Por cierto este es un buen lugar para documentar que en ocasiones la limpieza de pantalla modificaba la cadena y no permitía eliminar el carácter. Todo muy raro, pero al final ya no me pasó.

Poniendo todo junto

Finalmente, para leer una cadena sin mostrarla, y en su lugar mostrar asteriscos ya sea en C o C++ tenemos el siguiente código junto con su implementación en el main:

See the gist on github.

En el main defino mi cadena (línea 61) y la envío a la función leerContrasenaSinMostrarla. Cuando el usuario presione Enter, la función terminará y yo tendré la contraseña leída desde C.

Recuerda que tú decides qué hacer con la contraseña. Yo la muestro por motivos de prueba, pero tú puedes hacer cualquier otra cosa.

Para terminar te dejo con más tutoriales de C en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Solución: Unable to extract uploader id con youtube-dl

En mi blog te he enseñado a usar youtube-dl para descargar vídeos con permiso del…

6 horas hace

Enviar foto a Telegram usando cURL y Bot

Siguiendo con los tutoriales que consumen la API de los Bots de Telegram con cURL…

7 horas hace

cURL y Telegram: enviar mensaje a Bot

En un post previo te enseñé a enviar un mensaje en nombre de un Bot…

9 horas hace

Impresora térmica con Telegram usando Bot

En este artículo te voy a mostrar una guía para imprimir en una impresora térmica…

13 horas hace

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

5 días hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

5 días hace

Esta web usa cookies.