2009-09-11 8 views
42

necesito leer una contraseña de la entrada estándar y quería std::cin no hacerse eco de los caracteres tecleados por el usuario ...lectura una contraseña de std :: cin

¿Cómo puedo desactivar el eco de std :: cin ?

Este es el código que estoy usando actualmente:

string passwd; 
cout << "Enter the password: "; 
getline(cin, passwd); 

Estoy buscando una manera independiente del sistema operativo para hacer esto. Here hay formas de hacerlo en Windows y * nix.

+0

http://stackoverflow.com/questions/13687769/how-to-get-a-password-input-in-c-console-application/13687770#13687770 –

Respuesta

50

@ wrang-wrang respuesta fue muy buena, pero no cumplió con mis necesidades, esto es lo que mi código final (que se basa en this) vea como: el uso

#ifdef WIN32 
#include <windows.h> 
#else 
#include <termios.h> 
#include <unistd.h> 
#endif 

void SetStdinEcho(bool enable = true) 
{ 
#ifdef WIN32 
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode; 
    GetConsoleMode(hStdin, &mode); 

    if(!enable) 
     mode &= ~ENABLE_ECHO_INPUT; 
    else 
     mode |= ENABLE_ECHO_INPUT; 

    SetConsoleMode(hStdin, mode); 

#else 
    struct termios tty; 
    tcgetattr(STDIN_FILENO, &tty); 
    if(!enable) 
     tty.c_lflag &= ~ECHO; 
    else 
     tty.c_lflag |= ECHO; 

    (void) tcsetattr(STDIN_FILENO, TCSANOW, &tty); 
#endif 
} 

muestra:

#include <iostream> 
#include <string> 

int main() 
{ 
    SetStdinEcho(false); 

    std::string password; 
    std::cin >> password; 

    SetStdinEcho(true); 

    std::cout << password << std::endl; 

    return 0; 
} 
10

No hay nada en el estándar para esto.

En Unix, podría escribir algunos bytes mágicos según el tipo de terminal.

Use getpasswd si está disponible.

Puede sistema() /usr/bin/stty -echo para deshabilitar echo, y /usr/bin/stty echo para habilitarlo (de nuevo, en Unix).

This guy explains cómo hacerlo sin usar "stty"; No lo intenté yo mismo.

+0

Supongo que 'getpasswd' realmente ayudaría. Pero estoy buscando una forma de hacerlo sin tener que recurrir a la magia negra del sistema operativo – Vargas

+2

@Jonathan El segundo enlace que mencionó está muerto. – cbinder

2

Solo idea de lo que tengo, podría leer la contraseña char por char, y después simplemente imprimir el espacio de retroceso ("\ b") y tal vez '*'.

+4

Si alguien está registrando la salida del terminal en un archivo, la contraseña estará allí. Probablemente no sea una buena idea, entonces. – Artelius

+4

Mismo caso que alguien registrando presionando todas las teclas :) – IProblemFactory

+1

Esto es inseguro, y una mala idea. Es inaceptable confiar en el otro lado de la tubería por su propia seguridad. Y tenga cuidado de no canalizar la red. ¡Y salida de registro! = Pulsación de sesión de registro: normalmente otorgará el derecho de lectura del archivo de registro a más personas que aquellas con derechos para escribir sobre el programa emulador de terminal o para enganchar eventos de terminal o sistema o controlador de teclado. – ignis

6

Si no le importa la portabilidad, puede usar _getch() en VC.

#include <iostream> 
#include <string> 
#include <conio.h> 

int main() 
{ 
    std::string password; 
    char ch; 
    const char ENTER = 13; 

    std::cout << "enter the password: "; 

    while((ch = _getch()) != ENTER) 
    { 
     password += ch; 
     std::cout << '*'; 
    } 
} 

Existe también getwch() para wide characters. Mi consejo es que uses NCurse que también está disponible en los sistemas *nix.

Cuestiones relacionadas