Скрыть ввод пароля на терминале - PullRequest
50 голосов
/ 28 июля 2011

Я хочу замаскировать свой пароль при написании его с помощью *. Я использую Linux GCC для этого кода. Я знаю, что одним из решений является использование getch() функции, подобной этой

#include <conio.h>   
int main()
{
    char c,password[10];
    int i;
    while( (c=getch())!= '\n');{
        password[i] = c;
        printf("*");
        i++;
    }
    return 1;
}

но проблема в том, что GCC не включает файл conio.h, поэтому getch() для меня бесполезен. У кого-нибудь есть решение?

Ответы [ 13 ]

0 голосов
/ 27 августа 2015

В C вы можете использовать функцию getpasswd(), которая в значительной степени делает то же самое, что и stty в оболочке, например:

#include <stdio.h>
#include <string.h>
#include <pwd.h>
#include <unistd.h>

int main()
{
    char acct[80], password[80];

    printf(“Account: “);
    fgets(acct, 80, stdin);

    acct[strlen(acct)-1] = 0; /* remove carriage return */

    strncpy(password, getpass(“Password: “), 80);
    printf(“You entered acct %s and pass %s\n”, acct, password);

    return 0;
}

Вот эквивалентный сценарий оболочки, который использует stty (который изменяетнастройки вашего tty):

save_state=$(stty -g)
/bin/echo -n “Account: “
read acct
/bin/echo -n “Password: “
stty -echo
read password # this won’t echo
stty “$save_state”
echo “”
echo account = $acct and password = $password

Источник: Как я могу прочитать пароль, не отображая его в C?

0 голосов
/ 28 июля 2011

С помощью сканирования символов вы можете взять его в буфер. Также вам нужно написать код, если нажата клавиша Backspace, и соответствующим образом исправить введенный пароль.

Вот код, который я однажды написал с проклятиями. Компилировать с gcc file.c -o pass_prog -lcurses

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

#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;
}
0 голосов
/ 28 июля 2011

К сожалению, в стандартной библиотеке C такой функции нет из коробки.Может быть, в сторонней библиотеке.

Один из вариантов - использовать escape-последовательности ANSI, чтобы установить цвет фона на основной цвет в консоли, чтобы скрыть пароль.Попробуйте эту ссылку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...