Taking password as input in C++ - GeeksforGeeks

21 Aug, 2021
There are two methods in which input can be taken in a more secure way:
Do not display any content.
Display a special character such as an asterisk instead of actual content.
In this method, input content will be invisible. This can be implemented in two ways:
Program 1:
Below is the program where console mode is set to enable, echo input, and reset the console mode:
C++
// C++ program to take the input// invisibly#include <iostream>#include <windows.h>using namespace std; // Function take password and// reset to console modestd::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 Codeint main(){    string input;    cout << "@root>>> ";     // Function Call    input = takePasswdFromUser();     // Print the input    cout << input << endl;}
Output: 
For this getch() is used. This function takes a character input from user without buffer and doesn’t wait for the user to press “return” key.
Program 2:
Below is the C++ program to demonstrate the use of getch() in 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 Codeint main(){    string input;    cout << "@root>>> ";     // Function call    input = takePasswdFromUser();    cout << input << endl;}
Output: 
Drawback: The user can’t clear the response made earlier. When backspace is pressed, the input is returned.
Program 3:
Below is the C++ program to demonstrate the solution to the above drawback: 
C++
// C++ program to demonstrate the// solution of above drawback#include <conio.h>#include <iostream>using namespace std; // Enumeratorenum TT_Input {     // ASCII code of backspace is 8    BACKSPACE = 8,    RETURN = 32}; // Function accepting passwordstd::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 Codeint main(){    string input;    cout << "@root>>> ";     // Function call    input = takePasswdFromUser();    cout << input << endl;}
The idea is to use the library <conio.h> here to hide password with asterisk(*). Below is the C++ program using conio.h to hide the password using *:
Program 4: 
C++
// C++ program to hide the password// using *(asterik)#include <conio.h>#include <iostream>using namespace std; // Enumeratorenum IN {     // 13 is ASCII for carriage    // return    IN_BACK = 8,    IN_RET = 13 }; // Function that accepts the passwordstd::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 Codeint main(){    string input;    cout << "@root>>> ";     // Function call    input = takePasswdFromUser();    cout << input << endl;}
 
adnanirshad158
cpp-input-output
Input and Output
C++
C++ Programs
Programming Language
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Operator Overloading in C++
Polymorphism in C++
Friend class and function in C++
Sorting a vector in C++
std::string class in C++
Header files in C/C++ and its uses
Program to print ASCII Value of a character
How to return multiple values from a function in C or C++?
C++ Program for QuickSort
Sorting a Map by value in C++ STL