Tomando la contraseña como entrada en C++

Hay dos métodos en los que la entrada se puede tomar de una manera más segura:

  • No mostrar ningún contenido.
  • Muestre un carácter especial como un asterisco en lugar del contenido real.

En este método, el contenido de entrada será invisible. Esto se puede implementar de dos maneras:

usando <windows.h> :

Programa 1:

A continuación se muestra el programa donde el modo de consola está configurado para habilitar, hacer eco de entrada y restablecer el modo de consola:

C++

// C++ program to take the input
// invisibly
#include <iostream>
#include <windows.h>
using namespace std;
 
// Function take password and
// reset to console mode
std::string takePasswdFromUser()
{
    HANDLE hStdInput
        = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode = 0;
 
    // Create a restore point Mode
    // is know 503
    GetConsoleMode(hStdInput, &mode);
 
    // Enable echo input
    // set to 499
    SetConsoleMode(
        hStdInput,
        mode & (~ENABLE_ECHO_INPUT));
 
    // Take input
    string ipt;
    getline(cin, ipt);
 
    // Otherwise next cout will print
    // into the same line
    cout << endl;
 
    // Restore the mode
    SetConsoleMode(hStdInput, mode);
 
    return ipt;
}
 
// Driver Code
int main()
{
    string input;
    cout << "@root>>> ";
 
    // Function Call
    input = takePasswdFromUser();
 
    // Print the input
    cout << input << endl;
}

Producción: 

usando < conio.h > : 

Para esto se usa getch() . Esta función toma una entrada de carácter del usuario sin búfer y no espera a que el usuario presione la tecla «retorno».

Programa 2:

A continuación se muestra el programa C++ para demostrar el uso de getch() en conio.h:

C++

// C++ program to demonstrate the
// use of getch()
#include <conio.h>
#include <iostream>
using namespace std;
 
// Function using getch()
std::string takePasswdFromUser()
{
    string ipt = "";
    char ipt_ch;
    while (true) {
        ipt_ch = getch();
 
        // Check whether user enters
        // a special non-printable
        // character
        if (ipt_ch < 32) {
            cout << endl;
            return ipt;
        }
        ipt.push_back(ipt_ch);
    }
}
 
// Driver Code
int main()
{
    string input;
    cout << "@root>>> ";
 
    // Function call
    input = takePasswdFromUser();
    cout << input << endl;
}

Producción: 

Inconveniente: el usuario no puede borrar la respuesta realizada anteriormente. Cuando se presiona la tecla de retroceso , se devuelve la entrada.

Programa 3:

A continuación se muestra el programa C++ para demostrar la solución al inconveniente anterior: 

C++

// C++ program to demonstrate the
// solution of above drawback
#include <conio.h>
#include <iostream>
using namespace std;
 
// Enumerator
enum TT_Input {
 
    // ASCII code of backspace is 8
    BACKSPACE = 8,
    RETURN = 32
};
 
// Function accepting password
std::string takePasswdFromUser()
{
    string ipt = "";
    char ipt_ch;
    while (true) {
        ipt_ch = getch();
 
        if (ipt_ch < TT_Input::RETURN
            && ipt_ch != TT_Input::BACKSPACE) {
            cout << endl;
            return ipt;
        }
 
        // Check whether the user
        // pressed backspace
        if (ipt_ch == TT_Input::BACKSPACE) {
 
            // Check if ipt is empty or not
            if (ipt.length() == 0)
                continue;
            else {
 
                // Removes last character
                ipt.pop_back();
 
                continue;
            }
        }
        ipt.push_back(ipt_ch);
    }
}
 
// Driver Code
int main()
{
    string input;
    cout << "@root>>> ";
 
    // Function call
    input = takePasswdFromUser();
    cout << input << endl;
}

Ocultar la contraseña por un carácter especial (*) :

La idea es usar la biblioteca <conio.h> aquí para ocultar la contraseña con asterisco (*) . A continuación se muestra el programa C++ que usa conio.h para ocultar la contraseña usando *:

Programa 4: 

C++

// C++ program to hide the password
// using *(asterik)
#include <conio.h>
#include <iostream>
using namespace std;
 
// Enumerator
enum IN {
 
    // 13 is ASCII for carriage
    // return
    IN_BACK = 8,
    IN_RET = 13
 
};
 
// Function that accepts the password
std::string takePasswdFromUser(
    char sp = '*')
{
    // Stores the password
    string passwd = "";
    char ch_ipt;
 
    // Until condition is true
    while (true) {
 
        ch_ipt = getch();
 
        // if the ch_ipt
        if (ch_ipt == IN::IN_RET) {
            cout << endl;
            return passwd;
        }
        else if (ch_ipt == IN::IN_BACK
                 && passwd.length() != 0) {
            passwd.pop_back();
 
            // Cout statement is very
            // important as it will erase
            // previously printed character
            cout << "\b \b";
 
            continue;
        }
 
        // Without using this, program
        // will crash as \b can't be
        // print in beginning of line
        else if (ch_ipt == IN::IN_BACK
                 && passwd.length() == 0) {
            continue;
        }
 
        passwd.push_back(ch_ipt);
        cout << sp;
    }
}
 
// Driver Code
int main()
{
    string input;
    cout << "@root>>> ";
 
    // Function call
    input = takePasswdFromUser();
    cout << input << endl;
}

Publicación traducida automáticamente

Artículo escrito por mohdatishanx y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *