how to display * for input password

Aug 15, 2008 at 3:37am
how to display * when user is require to input the password?
Last edited on Aug 15, 2008 at 3:37am
Aug 15, 2008 at 3:45am
That is a system-dependant thing to do. What OS are you using?

If you want something more platform-independant, check out NCurses (unix) and PDCurses (windows).
Aug 15, 2008 at 4:00am
I did it like that:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main(){
   string pass ="";
   char ch;
   cout << "Enter pass\n";
   ch = _getch();
   while(ch != 13){//character 13 is enter
      pass.push_back(ch);
      cout << '*';
      ch = _getch();
   }
   if(pass == "Mitsakos"){
      cout << "\nAccess granted :P\n";
   }else{
      cout << "\nAccess aborted...\n";
   }
}


Isn't it right?
Aug 15, 2008 at 9:24am
Isn't it right?

It's a MS-Dos/Windows only solution, since _getch() is defined in conio.h which is MS specific. Plus, it isn't secure. Now the question is: should it be? Or should it just look neat? If it really is a password input, it certainly should be. In which case you need platform specific functions anyways (but not _getch()). Read the documentation of your OS-API for details.
Aug 17, 2008 at 9:37am
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main(){
   string pass ="";
   char ch;
   cout << "Enter pass\n";
   ch = _getch();
   while(ch != 13){//character 13 is enter
      pass.push_back(ch);
      cout << '*';
      ch = _getch();
   }
   if(pass == "Mitsakos"){
      cout << "\nAccess granted :P\n";
   }else{
      cout << "\nAccess aborted...\n";
   }
}


Could you please explain me that part of your code as i am working on a similar program and thought why not ask in this thread rather than creating a new one.

And one more thing. I work on Turbo C++.
Last edited on Aug 17, 2008 at 9:41am
Aug 17, 2008 at 4:04pm
If conio.h is only from MS i don't know if it will work with Turbo C++.

But anyway here is how I thought about it.
the _getch() function wait's for an input from the keyboard but doesn't show the key to the console.

ch = _getch(); Reads a keystoke and saves it to the ch, but doesn't display it in the console.

while(ch != 13){ As long as the user doesn't press Enter (enter is ASCII code 13) continue reading keystrokes from the screen.

pass.push_back(ch); The pass is a string variable. The push_back() method puts the character specified as parameter at the end of the string.
http://www.cplusplus.com/reference/string/string/push_back.html

cout << '*'; Since nothing has been displayed from the keystroke we display an asterisk ( '*' ) for every key.

ch = _getch(); You read another keystroke to continue reading keystrokes from the user.


I don't know if you need anything else. Hope this helps.
Aug 17, 2008 at 5:49pm
conio.h should be included in the OS API, as far as I know, so work under any compiler in Windows.
Last edited on Aug 17, 2008 at 5:52pm
Aug 17, 2008 at 10:19pm
conio.h is an old Borland extention for Turbo C/C++ (which only works on 16-bit DOS and emulators), and is very much deprecated in modern compilers.

If you know you will be sticking to Windows development, you can change the console input mode to do your bidding.

Also, stay away from directly coding ASCII values. It probably won't hurt, but it could someday... so it is considered bad practice.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <stdexcept>
#include <string>
#include <windows.h>
using namespace std;

string getpassword( const string& prompt = "Enter password> " )
  {
  string result;

  // Set the console mode to no-echo, not-line-buffered input
  DWORD mode, count;
  HANDLE ih = GetStdHandle( STD_INPUT_HANDLE  );
  HANDLE oh = GetStdHandle( STD_OUTPUT_HANDLE );
  if (!GetConsoleMode( ih, &mode ))
    throw runtime_error(
      "getpassword: You must be connected to a console to use this program.\n"
      );
  SetConsoleMode( ih, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );

  // Get the password string
  WriteConsoleA( oh, prompt.c_str(), prompt.length(), &count, NULL );
  char c;
  while (ReadConsoleA( ih, &c, 1, &count, NULL) && (c != '\r') && (c != '\n'))
    {
    if (c == '\b')
      {
      if (result.length())
        {
        WriteConsoleA( oh, "\b \b", 3, &count, NULL );
        result.erase( result.end() -1 );
        }
      }
    else
      {
      WriteConsoleA( oh, "*", 1, &count, NULL );
      result.push_back( c );
      }
    }

  // Restore the console mode
  SetConsoleMode( ih, mode );

  return result;
  }

int main()
  {
  try {

    string password = getpassword( "Enter a test password> " );
    cout << "\nYour password is " << password << endl;

    }
  catch (exception& e)
    {
    cerr << e.what();
    return 1;
    }

  return 0;
  }

This is not secure. A keylogger can spy on what you type. (This is,
sadly, fairly normal. I don't know of any specific Win32 API function that
will securely read a password, but I know that the OS has one in there somewhere...)

Hope this helps.

[edit] Fixed a bug.
Last edited on Aug 28, 2008 at 11:10am
Aug 17, 2008 at 11:42pm
as far as i know a keylogger will ALWAYS catch ur input... it may simulate the driver...
Aug 17, 2008 at 11:49pm
If you've let a keylogger get that kind of access to your system, then yes, you are royally screwed.

But for lesser softwares you can disable all hooks, etc. to prevent peeking. Failure to do so means even low-access software can hook and peek.

Alas.
Aug 22, 2008 at 11:22am
Hi,
I am Rammohan from Bangalore and working as a Technical lead in big IT firm .
Solution for your answer is follows:


I believe you are a student and so I have written the following code to compile in TurboC. Since you people are using Turboc in your institutes. If you want the solution to work for other compiler or any other platform also please ask me and I will definitely send you in my way of code to work in all the platforms…

#include<iostream.h>
#include<conio.h>
void main()
{
clrscr();
cout<<"Enter password: \n";
restart:int x[100],x1[100],i,j=0,k=0,l;
for(i=0;i<=100;i++)
{
Rammohan:l=getch();
if(((l>=48)&&(l<=126))||(l==8)||(l==13))
x[i]=l;
else goto Rammohan;
if(x[i]==13)
break;
else if(x[i]==8)
{
gotoxy(1,2);
clreol();
for(i=0;i<100;i++)
x[i]='\0';
goto restart;
}
else
{
cout<<"*";
k++;
}
}
cout<<"\nRe enter password: \n";
for(i=0;i<=k;i++)
{
x1[i]=getche();
if(x1[i]==13)break;
}
for(i=0;i<=k;i++)
if(x[i]!=x1[i])
j++;
if(j==0)
cout<<"\nPasswords match!!\n";
else cout<<"\nPasswords do not match!!\n";
getch();
}
____________________
Regards,
Rammohan Alampally,
rammohan@india.com
Technical Lead,
Bangalore, India.
www.FindSyntax.com -> Worlds first Web based Windows O/S is a Brain Chaild of Rammohan
Aug 22, 2008 at 12:37pm
omg... may u use the [code]-brackets plz... mr-big-it ... nice english :P...
Aug 22, 2008 at 2:59pm
*sigh*
Aug 22, 2008 at 10:56pm
nice
do someone know solution to hide entered character to console in linux?
Rammohan, could you help me with this? ;)
Aug 22, 2008 at 11:12pm
Whether in Windows or Linux, you still need to set the keyboard to no-echo, unbuffered input. Here's an example of how to do that in linux:
http://www.cplusplus.com/forum/beginner/1988/page4.html#msg14522

Once you are in raw mode, use the same method as above to get the input and display *s.

Good luck!
Aug 23, 2008 at 6:23pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream.h>
#include<conio.h>
void main()
       {
             clrscr();
             cout<<"Enter password: \n";
             restart:int x[100],x1[100],i,j=0,k=0,l;
             for(i=0;i<=100;i++)
                 {
                     Rammohan:l=getch();
                     if(((l>=48)&&(l<=126))||(l==8)||(l==13))
                         x[i]=l;
                     else 
                         goto Rammohan;
                     if(x[i]==13)
                         break;
                    else if(x[i]==8)
                           {
                             gotoxy(1,2);
                             clreol();
                                for(i=0;i<100;i++)
                                    x[i]='\0';
                                goto restart;
                     }
else
{
           cout<<"*";
           k++;
}
}
cout<<"\nRe enter password: \n";
for(i=0;i<=k;i++)
    {
          x1[i]=getche();
          if(x1[i]==13)break;
    }
for(i=0;i<=k;i++)
     if(x[i]!=x1[i])
         j++;
     if(j==0)
        cout<<"\nPasswords match!!\n";
     else 
        cout<<"\nPasswords do not match!!\n";
     getch();
}
Sep 8, 2008 at 5:27pm
Well i wrote this code based on the codes posted above.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	char pass[5];
	int i=0;
	cout<<"\n\n Pass : ";
	pass[0]=_getch();
	while(pass[i]!=13)
	{
		i++;
		cout<<"*";
		pass[i]=_getch();
	}
	
	cout<<"\n\n";
	
	cout<<pass;
	
	getch();


Well the bizarre problem is that if the starting character of the password is 'a' the the output statement "cout<<pass" shows a smiley face (maybe some ASCII value of DOS )instead of 'a' lol?

For ex : Inputted Pass is : abc

Displayed Pass is : smiley-facebc

EDIT : I recently discoverd that if the entered pass is 3 letters only the above mentioned error comes. Can someone explain this to me why ?
This sort of thing doesn't happen if 'a' is anywhere other than the starting character in thr array and the array hold only 3 letters.
Last edited on Sep 8, 2008 at 5:37pm
Sep 8, 2008 at 11:24pm
Failure to initialize creates a great big surprise.

Include <cstring> and put the following line between lines 2 and 3 above:

memset( pass, 0, 5 );
[edit] Oh, and keep your passwords four characters or less.
Last edited on Sep 8, 2008 at 11:24pm
Topic archived. No new replies allowed.