Hide password input on terminal

后端 未结 15 1674
清酒与你
清酒与你 2020-11-22 09:55

I want to mask my password while writing it with *. I use Linux GCC for this code. I know one solution is to use getch() function like this

15条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 10:29

    With scanning the characters you can take it into a buffer. Also you need to write code if backspace is pressed, and appropriately correct the inserted password.

    Here is a code which once i wrote with the curses. Compile with gcc file.c -o pass_prog -lcurses

    #include 
    #include 
    #include 
    
    #define ENOUGH_SIZE 256
    
    #define ECHO_ON 1
    #define ECHO_OFF 0
    
    #define BACK_SPACE 127
    
    char *my_getpass (int echo_state);
    
    int main (void)
    {
      char *pass;
    
      initscr ();
    
      printw ("Enter Password: ");
      pass = my_getpass (ECHO_ON);
    
      printw ("\nEntered Password: %s", pass);
      refresh ();
      getch ();
      endwin ();
      return 0;
    }
    
    
    char *my_getpass (int echo_state)
    {
      char *pass, c;
      int i=0;
    
      pass = malloc (sizeof (char) * ENOUGH_SIZE);
      if (pass == NULL)
      {
        perror ("Exit");
        exit (1);
      }
    
      cbreak ();
      noecho ();
    
      while ((c=getch()) != '\n')
      {
        if (c == BACK_SPACE)
        {
          /* Do not let the buffer underflow */
          if (i > 0)
          { 
            i--;
            if (echo_state == ECHO_ON)
                   printw ("\b \b");
          }
        }
        else if (c == '\t')
          ; /* Ignore tabs */
        else
        {
          pass[i] = c;
          i = (i >= ENOUGH_SIZE) ? ENOUGH_SIZE - 1 : i+1;
          if (echo_state == ECHO_ON)
            printw ("*");
        }
      }
      echo ();
      nocbreak ();
      /* Terminate the password string with NUL */
      pass[i] = '\0';
      endwin ();
      return pass;
    }
    

提交回复
热议问题